首页 > 后端开发 > C++ > 正文

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

Patricia Arquette
发布: 2024-10-31 08:43:02
原创
614 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!