В C# при создании лямбд внутри цикла, которые захватывают переменную цикла (например, i), все лямбды будут ссылаться на одну и ту же переменную i. После завершения цикла значение i будет равно 10, поэтому при вызове всех лямбд они выведут 10.
List<Action> actions = new List<Action>();
В C# при создании лямбд внутри цикла, которые захватывают переменную цикла (например, i), все лямбды будут ссылаться на одну и ту же переменную i.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
List<Action> actions = new List<Action>(); for (var count = 0; count < 10; count++) { actions.Add(() => System.Console.WriteLine(count)); } foreach (var action in actions) { action(); }
Что будет в stdout?
Ответ
В C# при создании лямбд внутри цикла, которые захватывают переменную цикла (например, i), все лямбды будут ссылаться на одну и ту же переменную i. После завершения цикла значение i будет равно 10, поэтому при вызове всех лямбд они выведут 10.
Пример:
var actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action(); // выведет 10 десять раз
}
Чтобы получить ожидаемый вывод от 0 до 9, нужно захватывать копию переменной внутри цикла:
for (int i = 0; i < 10; i++)
{
int copy = i;
actions.Add(() => Console.WriteLine(copy));
}
Тогда при вызове лямбд выведутся числа от 0 до 9.