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

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
歡迎來(lái)到閉包和捕獲變量的世界:)
埃里克·利珀特(Eric Lippert)對(duì)這種行為有深入的解釋?zhuān)?/p>
關(guān)閉循環(huán)變量被認(rèn)為是有害的
關(guān)閉循環(huán)變量,第二部分
基本上,捕獲的是循環(huán)變量,而不是值。要獲得您認(rèn)為應(yīng)該獲得的東西,請(qǐng)執(zhí)行以下操作:
foreach (var type in types)
{
var newType = type;
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
helloMethods.Add(sayHello);
}

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
作為暗示SWeko引用的博客文章的簡(jiǎn)要說(shuō)明,lambda捕獲變量而不是value。在foreach循環(huán)中,變量在每次迭代中都不是唯一的,在循環(huán)期間使用相同的變量(當(dāng)您看到編譯器在編譯時(shí)對(duì)foreach執(zhí)行的擴(kuò)展時(shí),這一點(diǎn)更加明顯)。結(jié)果,您在每次迭代中都捕獲了相同的變量,并且該變量(截至上次迭代)指的是集合中的最后一個(gè)元素。
更新:在較新版本的語(yǔ)言(從C#5開(kāi)始)中,循環(huán)變量在每次迭代中都被視為新變量,因此關(guān)閉它不會(huì)產(chǎn)生與較早版本(C#4和更低版本)相同的問(wèn)題。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以通過(guò)引入其他變量來(lái)修復(fù)它:
...
foreach (var type in types)
{
var t = type;
var sayHello = new PrintHelloType(greeting => SayGreetingToType(t, greeting));
helloMethods.Add(sayHello);
}
....
- 3 回答
- 0 關(guān)注
- 733 瀏覽
添加回答
舉報(bào)