Здравствуйте, nikov, Вы писали:
N>Решил проверить, как в релизной версии Nemerle работает вывод типов по сравнению с C#.
А, видимо это мой недосмотр! Nemerle ведь компилируется под .NET 3.5, где интерфейс IEnumerable<T> не был объявлен ковариантным. А C# код я проверял под .NET 4.0.
Можно как-то заставить Nemerle компилироваться с mscorlib из .NET 4.0?
Здравствуйте, nikov, Вы писали:
N>А, видимо это мой недосмотр! Nemerle ведь компилируется под .NET 3.5, где интерфейс IEnumerable<T> не был объявлен ковариантным. А C# код я проверял под .NET 4.0.
N>Можно как-то заставить Nemerle компилироваться с mscorlib из .NET 4.0?
Надо положить в ProgramFiles/Nemerle вот эти бинарники. К сожалению, пока вместе 2 версии фреймоврка не работают, надо либо менять env var Nemerle, либо бинарники в Program Files.
Здравствуйте, nikov, Вы писали:
N>А, видимо это мой недосмотр! Nemerle ведь компилируется под .NET 3.5, где интерфейс IEnumerable<T> не был объявлен ковариантным. А C# код я проверял под .NET 4.0.
Проверил под .net 4, воспроизводится.
N>Можно как-то заставить Nemerle компилироваться с mscorlib из .NET 4.0?
Здравствуйте, Ziaw, Вы писали:
Z>Проверил под .net 4, воспроизводится.
Ага, я попробовал определить ковариантный интерфейс прямо в коде — ошибка осталась. Замена функциональных типов (которые, кажется, не поддерживают вариантность) на вариантный делегаты тоже не помогла.
Здравствуйте, nikov, Вы писали:
N>Ага, я попробовал определить ковариантный интерфейс прямо в коде — ошибка осталась. Замена функциональных типов (которые, кажется, не поддерживают вариантность) на вариантный делегаты тоже не помогла.
Жаль, я надеялся, что проблема в невосприятии родной ковариантности четверки.
error CS0411: The type arguments for method 'Program.Foo<T>(System.Func<System.Collections.Generic.IEnumerable<System.Collections.Generic.List<int>>,T>, System.Func<System.Collections.Generic.IEnumerable<System.Collections.Generic.IList<int>>,T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
если компилировать на 3.5-ом фрэймворке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
А это случаем не ковариантность?
Тут ведь выходит, что T одновременно должно унифицироваться как с List[int], так и с IList[int].
Хотя IList[int] подтип List[int]...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
N>А, видимо это мой недосмотр! Nemerle ведь компилируется под .NET 3.5, где интерфейс IEnumerable<T> не был объявлен ковариантным. А C# код я проверял под .NET 4.0.
N>Можно как-то заставить Nemerle компилироваться с mscorlib из .NET 4.0?
Из командной строки — скачать бинарники, разархивировать их куда-то и компилировать из командной строки.
Только тормозить будет. Чтобы не тормозило можно ngen по бинарникам прогнать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
N>Ага, я попробовал определить ковариантный интерфейс прямо в коде — ошибка осталась. Замена функциональных типов (которые, кажется, не поддерживают вариантность) на вариантный делегаты тоже не помогла.
Боюсь, что с функциональным типом оно вообще не выйдет, так как он же в класс переписывается. А для них ковариантности нет.
А вот с делегатами наверно косяк. Надо смотреть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
N>Ага, я попробовал определить ковариантный интерфейс прямо в коде — ошибка осталась. Замена функциональных типов (которые, кажется, не поддерживают вариантность) на вариантный делегаты тоже не помогла.
Пример никак нельзя упростить? Сдается мне дело в ковариантности для делегатов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.