第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在lambda表達(dá)式中使用foreach循環(huán)的迭代器變量-為什么失敗?

在lambda表達(dá)式中使用foreach循環(huán)的迭代器變量-為什么失?。?/h1>
C#
守候你守候我 2019-11-02 10:11:20
考慮以下代碼:public class MyClass{   public delegate string PrintHelloType(string greeting);    public void Execute()    {        Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};        List<PrintHelloType> helloMethods = new List<PrintHelloType>();        foreach (var type in types)        {            var sayHello =                 new PrintHelloType(greeting => SayGreetingToType(type, greeting));            helloMethods.Add(sayHello);        }        foreach (var helloMethod in helloMethods)        {            Console.WriteLine(helloMethod("Hi"));        }    }    public string SayGreetingToType(Type type, string greetingText)    {        return greetingText + " " + type.Name;    }...}調(diào)用之后myClass.Execute(),代碼將輸出以下意外響應(yīng):嗨Int32嗨Int32嗨Int32  很顯然,我希望"Hi String","Hi Single","Hi Int32",但顯然并非如此。為什么在所有3種方法中都使用了迭代數(shù)組的最后一個(gè)元素而不是適當(dāng)?shù)姆椒??您將如何重?xiě)代碼以實(shí)現(xiàn)期望的目標(biāo)?
查看完整描述

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);

}


查看完整回答
反對(duì) 回復(fù) 2019-11-02
?
Qyouu

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)題。


查看完整回答
反對(duì) 回復(fù) 2019-11-02
?
隔江千里

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);

        }

....


查看完整回答
反對(duì) 回復(fù) 2019-11-02
  • 3 回答
  • 0 關(guān)注
  • 733 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)