Есть кусок кода, который приводит к ошибке компиляции
Test.n:10:16:10:31: error: expected System.Collections.Generic.IEnumerable[object+], got void in function return value: void is not a subtype of System.Collections.Generic.IEnumerable[object+]
Если поменять комментарий и убрать явную пропись IEnumerable[_] из сигнатуры функции f, то код заработает:
using System.Console;
using System.Collections.Generic;
public module Tester {
public Test () : IEnumerable [int]
{
// def f ()
def f () : IEnumerable [_]
{
for (mutable i = 0; i < 10; i ++)
{
yield i
}
}
f ()
}
}
foreach (i in Tester.Test())
{
WriteLine (i)
}
Здравствуйте, dsorokin, Вы писали:
D>Есть кусок кода, который приводит к ошибке компиляции
Это не ошибка компиляции, а ошибка автора куска кода
Оператор yield обозначает передачу управления из метода, а не из локальной функции. Такое поведение имеет смысл и осуществлено, так сказать, by design.
Жаль, компилятор не выдает предупреждения про yield-ы из локальных функций.
Но ошибка таки забавная, потому что показывает, как компилятор лучше справляется с типизацией, чем человек.
В будущем этот пример можно использовать в интервью на работу в транснациональных корпорациях, где, конечно же, вовсю будет использоваться Nemerle
Здравствуйте, Аноним, Вы писали:
А>Но ошибка таки забавная, потому что показывает, как компилятор лучше справляется с типизацией, чем человек.
Это как раз не странно. Человек думает высокоуровневыми абстракциями, а компилтор тупо выполняет заданный (хотя и хитрый) алгорит.
Достижением является скорее то когда чловек начинат думать о компилятор, что тот думает
.