[英]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();
}
除了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.