在lambda表達式中使用foreach循環的迭代器變量-為什么失?。?/h1>
3 回答

TA貢獻2041條經驗 獲得超4個贊
歡迎來到閉包和捕獲變量的世界:)
埃里克·利珀特(Eric Lippert)對這種行為有深入的解釋:
關閉循環變量被認為是有害的
關閉循環變量,第二部分
基本上,捕獲的是循環變量,而不是值。要獲得您認為應該獲得的東西,請執行以下操作:
foreach (var type in types)
{
var newType = type;
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
helloMethods.Add(sayHello);
}

TA貢獻1786條經驗 獲得超11個贊
作為暗示SWeko引用的博客文章的簡要說明,lambda捕獲變量而不是value。在foreach循環中,變量在每次迭代中都不是唯一的,在循環期間使用相同的變量(當您看到編譯器在編譯時對foreach執行的擴展時,這一點更加明顯)。結果,您在每次迭代中都捕獲了相同的變量,并且該變量(截至上次迭代)指的是集合中的最后一個元素。
更新:在較新版本的語言(從C#5開始)中,循環變量在每次迭代中都被視為新變量,因此關閉它不會產生與較早版本(C#4和更低版本)相同的問題。

TA貢獻1906條經驗 獲得超10個贊
您可以通過引入其他變量來修復它:
...
foreach (var type in types)
{
var t = type;
var sayHello = new PrintHelloType(greeting => SayGreetingToType(t, greeting));
helloMethods.Add(sayHello);
}
....
- 3 回答
- 0 關注
- 743 瀏覽
添加回答
舉報