Решил проверить, как в релизной версии Nemerle работает вывод типов по сравнению с C#.
Вот такой пример в C# работает на ура:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
Foo(Enumerable.Reverse, Enumerable.Reverse);
}
static void Foo<T>(Func<IEnumerable<List<int>>, T> x, Func<IEnumerable<IList<int>>, T> y) { }
}
Nemerle же, к сожалению, не справляется:
using System;
using System.Linq;
using System.Collections.Generic;
module Program
{
Main() : void
{
// Error: in argument #2 (_y), needed a System.Collections.Generic.IEnumerable[System.Collections.Generic.IList[int]] ->
// System.Collections.Generic.IEnumerable[System.Collections.Generic.List[int]],
// got System.Collections.Generic.IEnumerable[?] -> System.Collections.Generic.IEnumerable[?]:
// the types System.Collections.Generic.IEnumerable[System.Collections.Generic.List[int]] and
// System.Collections.Generic.IEnumerable[System.Collections.Generic.IList[int]] are not compatible [simple unify]
Foo(Enumerable.Reverse, Enumerable.Reverse)
}
Foo[T](_x : IEnumerable[List[int]] -> T, _y : IEnumerable[IList[int]] -> T) : void { }
}
И даже явное указание типа-аргумента не спасает:
using System;
using System.Linq;
using System.Collections.Generic;
module Program
{
Main() : void
{
// Error: in argument #1 (_x), needed a System.Collections.Generic.IEnumerable[System.Collections.Generic.List[int]] ->
// System.Collections.Generic.IEnumerable[System.Collections.Generic.IList[int]],
// got System.Collections.Generic.IEnumerable[?] -> System.Collections.Generic.IEnumerable[?]:
// the types System.Collections.Generic.IEnumerable[System.Collections.Generic.IList[int]] and
// System.Collections.Generic.IEnumerable[System.Collections.Generic.List[int]] are not compatible [simple unify]
Foo.[IEnumerable[IList[int]]](Enumerable.Reverse, Enumerable.Reverse)
}
Foo[T](_x : IEnumerable[List[int]] -> T, _y : IEnumerable[IList[int]] -> T) : void { }
}