首页  >  文章  >  后端开发  >  为什么 lambda 表达式捕获迭代器变量的最终值而不是 foreach 循环中每次迭代期间的值?

为什么 lambda 表达式捕获迭代器变量的最终值而不是 foreach 循环中每次迭代期间的值?

Patricia Arquette
Patricia Arquette原创
2024-10-31 08:43:02600浏览

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

使用迭代器变量的 Lambda 表达式中的意外行为

在给定的代码中,调用 myClass.Execute() 时的预期输出为“Hi String”、“Hi Single”、“Hi Int32”。但是,该代码打印了三次“Hi Int32”。为什么会发生这种意外行为以及如何纠正?

问题在于 foreach 循环中使用的 lambda 表达式:

var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));

在此代码中,循环变量类型为由 lambda 表达式捕获。然而,捕获的并不是具体迭代时 type 的值,而是对变量本身的引用。

因此,当稍后调用 PrintHelloType 委托时,它使用的是 type 末尾的值。循环,即“Int32”。这会导致意外的输出。

解决方案:

为了达到预期的目标,可以在每次迭代期间使用一个新变量来捕获 type 的值:

foreach (var type in types)
{
   var newType = type;
   var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
   helloMethods.Add(sayHello);
}

现在每个 lambda 表达式都会捕获 newType 的值,这是特定迭代的正确值。然后产生预期的输出:“Hi String”、“Hi Single”、“Hi Int32”。

以上是为什么 lambda 表达式捕获迭代器变量的最终值而不是 foreach 循环中每次迭代期间的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn