рассмотрим следующую программу С#:
using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
static IEnumerable<Action> Get()
{
for (int i = 0; i < 2; i++)
{
int capture = i;
yield return () => Console.WriteLine(capture.ToString());
}
}
public static void Main(string[] args)
{
foreach (var a in Get()) a();
foreach (var a in Get().ToList()) a();
}
}
Когда выполняется в Mono-компиляторе (например, Mono 2.10.2.0 - вставляем в здесь), он записывает следующий вывод:
0
1
1
1
Это кажется мне совершенно нелогичным. При прямом итерации функции yield, область действия for-loop "правильно" (к моему пониманию) используется. Но когда я сначала храню результат в списке, область действия всегда является последним действием?!
Можно ли предположить, что это ошибка в компиляторе Mono, или я попал в загадочный угловой случай С# лямбда и урожайности?
BTW: при использовании компилятора Visual Studio (и для выполнения MS.NET или моно) результатом является ожидаемый 0 1 0 1