繁体   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