struct наносит ответный удар
От: Klapaucius  
Дата: 20.06.07 17:54
Оценка:
Некоторое время назад я уже сталкивался с багом, связанным с этим констрейнтом. Тот баг благополучно исправили. Но беда пришла снова, откуда не ждали.
using System;
using System.Console;
using Nemerle.Utility;

module Foo[T] 
    where T : struct
{
    public foo() : void
    {
        WriteLine("foo!")
    }
}

type Bar = Foo[int];

using Bar;

module Program
{
  Main() : void
  {
    Foo[int].foo(); //ok
    Bar.foo(); //ok
    foo(); //Error
    
    //the type `System.Object' must be a value type in order to use 
    //it as type parameter `T' in Foo[System.Object]
  }
}


Но может быть в этом и есть сермяжная правда? Может я что-то не то делаю?
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re: struct наносит ответный удар
От: Иванков Дмитрий Россия  
Дата: 20.06.07 19:12
Оценка: 14 (1)
Можно репортить, что-то про type alias кажется уже есть в багах (на всякий случай поискать дубликат), он вроде не предусматривает generic параметры =)

Вот еще пример

class A {}
class B : A {}
module Foo[T] 
   where T : A
{
    public foo() : void {}
}

type Bar = Foo[B];

using Bar;

module Program 
{
  Main () : void
  {
    foo (); //ok
  }
}


Скомпилируется, но вызовется Foo[A].foo ().

В чем суть:
— type alias теряет generic параметр
— при ограничении struct компилятор не может вывести тип, почему-то останавливается на object (хотя наверное мог бы и какой-нибудь System.ValueType), ну в принципе логично
— при ограничении A выводится собственно A, и все компилируется
Re[2]: struct наносит ответный удар
От: Иванков Дмитрий Россия  
Дата: 20.06.07 19:36
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ИД>В чем суть:

ИД>- type alias теряет generic параметр

конечно же using type alias его теряет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.