«Ловушка внешней переменной» возникает, когда разработчик ожидает, что значение переменной будет захвачено лямбда-выражением или анонимным делегатом, когда фактически переменная захвачена сама.
Пример:
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
actions.Add(() => Console.Write("{0} ", i));
}
foreach (var action in actions)
{
action();
}
Возможный вывод № 1:
0 1 2 3 4 5 6 7 8 9
Возможный вывод № 2:
10 10 10 10 10 10 10 10 10 10
Если вы ожидали выхода # 1, вы попали в ловушку внешней переменной. Вы получите вывод № 2.
Исправлено:
Объявите, что "Внутренняя переменная" будет записана несколько раз вместо "Внешней переменной", которая записывается только один раз.
var actions = new List<Action>();
for (var i = 0; i < 10; i++)
{
var j = i;
actions.Add(() => Console.Write("{0} ", j));
}
foreach (var action in actions)
{
action();
}
Подробнее см. Также Блог Эрика Липперта .