Вывод типов всё ещё слабоват
От: nikov США http://www.linkedin.com/in/nikov
Дата: 26.05.11 21:52
Оценка: 7 (1)
Решил проверить, как в релизной версии 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 { }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.