Это поведение обусловлено замыканиями .
Переменная, которая присутствует в вашей лямбде, является ссылкой и , а не значением копии.Это означает, что это указывает на последнее значение, принятое str
, которое в вашем случае является "ghi".Вот почему для каждого вызова он просто переходит в одну и ту же область памяти и восстанавливает, естественно, одно и то же значение.
Если вы пишете код, как в ответах, вы принудительно C#
компилятор для регенерации нового значения каждый раз, поэтому новый адрес будет передан в labmda, поэтому у каждой лямбды будет своя собственная переменная.
Кстати, если я не ошибаюсь, команда C#
обещает исправить это неестественное поведение в C# 5.0
.Так что лучше проверить их блог на эту тему для будущих обновлений.