Некоторое время назад я уже сталкивался с багом, связанным с этим констрейнтом. Тот баг благополучно исправили. Но беда пришла снова, откуда не ждали.
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
Можно репортить, что-то про 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, и все компилируется