Проблема здесь в том, что существует одна i
переменная и десять экземпляров / копий x
. Каждая лямбда получает ссылку на одну переменную i
и один из экземпляров x
. Каждое значение x
записывается только один раз, и, следовательно, каждая лямбда видит одно значение, записанное в значение, на которое оно ссылается.
Переменная i
записывается до тех пор, пока не достигнет 10. Ни одна из лямбд не запускается до завершения цикла, поэтому все они видят окончательное значение i
, равное 10
Я считаю, что этот пример немного понятнее, если переписать его следующим образом
int i = 0; // Single i for every iteration of the loop
while (i < 10) {
int x = i; // New x for every iteration of the loop
DoAction(() => {
Console.WriteLine(i);
Console.WriteLine(x);
});
i++;
};