我遇到了一個關於C#的有趣問題。我有像下面的代碼。C中循環捕獲變量#
List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
while (variable < 5)
{
actions.Add(() => variable * 2);
++ variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
我期望它輸出0,2,4,6,8,但是,它實際上輸出5分10秒。
看來,這是由於所有操作引用一個捕獲變量。結果,當它們被調用時,它們都具有相同的輸出。
有沒有辦法繞過此限制讓每個動作實例都有自己的捕獲變量?
另請參見Eric Lippert關於此主題的博客系列:[關閉循環變量被視爲有害](http://blogs.msdn.com/b/ericlippert/archive/tags/closures/) – Brian 2010-11-11 21:50:50
此外,他們正在改變C#5按照您的預期在foreach內工作。 (突破變化) – 2012-03-04 18:55:00
相關:[爲什麼這是一個不好用的迭代變量在一個lambda表達式](http://stackoverflow.com/questions/227820/why-is不好使用迭代變量的lambda表達式) – nawfal 2013-11-02 07:08:51