[英]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.