使用迭代器变量的 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中文网其他相关文章!