簡體   English   中英

無法理解lamda表達式輸出

[英]cannot understand lamda expression output

我有這段代碼,不明白為什么輸出是22! 恐怕應該是01! 誰能解釋會發生什么? 如果列表存儲的是帶有參數的方法,那么參數應分別為0和1!

List<Action> list = new List<Action>();

for (int i = 0; i < 2; i++)
{
    list.Add(() => Console.Write(i));
}

foreach (var it in list)
{
    it();
} 

它是封閉物( 12 )。

在您的情況下, Console.Write(i)將在進行操作調用時使用i值。 您首先在for循環中遞增i ,然后在第二個循環中調用列表中的每個動作。 在調用每個操作時, i值為2-因此,您得到22作為輸出。

為了獲得預期的結果,您應該創建i本地副本並使用它:

for (int i = 0; i < 2; i++)
{
    var temp = i; 
    list.Add(() => Console.Write(temp));
}

除了Roma Doskoch的答案,另一種方法是避免for

var list = Enumerable
               .Range(0, 2)
               .Select<int, Action>(i => () => Console.Write(i));

閉包捕獲變量,而不是值。

在您的代碼中,閉包捕獲變量i ,而不是每次迭代都將恰好存儲在i任何值。 當您調用該動作時,變量i的值為2 (因為循環已完成),因此2將被打印兩次。

為了避免這種情況,正如其他答案已經指出的那樣,您需要每次都創建一個新變量,作為無法捕獲值的解決方法。 如果您在每次迭代中聲明一個新變量,則捕獲變量的結果等同於捕獲值,因為您不會在下一次迭代中對其進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM