ОБНОВЛЕНИЕ: Здесь есть обширный анализ и комментарии по этому вопросу:
http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/
Это очень часто сообщаемая проблема; обычно это сообщается как ошибка компилятора, но на самом деле компилятор делает правильные вещи в соответствии со спецификацией. Анонимные функции закрывают переменных , а не значений , и существует только одна переменная цикла foreach. Поэтому каждая лямбда закрывается по одной и той же переменной и поэтому получает текущее значение этой переменной.
Это удивительно почти для всех, и приводит к большой путанице и множеству сообщений об ошибках. Мы рассматриваем изменение спецификации и реализации для гипотетической будущей версии C #, чтобы переменная цикла логически объявлялась внутри конструкции цикла, давая «свежую» переменную каждый раз через цикл.
Это было бы серьезным изменением , но я подозреваю, что число людей, которые зависят от этого странного поведения, довольно мало. Если у вас есть мнения по этому вопросу, не стесняйтесь добавлять комментарии к сообщениям в блоге, упомянутым выше в обновлении. Спасибо!