Если вы посмотрите на сгенерированный код (используя Reflector), вы увидите разницу:
private static void Method2()
{
List<Methodx> list = new List<Methodx>();
Methodx item = null;
<>c__DisplayClassa classa = new <>c__DisplayClassa();
classa.i = 0;
while (classa.i < 5)
{
if (item == null)
{
item = new Methodx(classa.<Method2>b__8);
}
list.Add(item);
classa.i++;
}
foreach (Methodx methodx2 in list)
{
Console.WriteLine("In main method c = " + methodx2(null));
}
}
Когда вы используете исходный код, он создает временный класс в фоновом режиме, этот класс содержит ссылку на переменную «i», поэтому, согласно ответу Джона, вы видите только окончательное значение этого.
private sealed class <>c__DisplayClassa
{
// Fields
public int i;
// Methods
public <>c__DisplayClassa();
public int <Method2>b__8(object obj);
}
Я действительно рекомендую просмотреть код в Reflector , чтобы увидеть, что происходит, как я понял смысл захваченных переменных. Убедитесь, что для параметра «Оптимизация кода» установлено значение «.NET 1.0» в меню «Параметры», в противном случае все скрытые действия будут скрыты.