该代码片段演示了在 lambda 表达式中使用 foreach 循环的迭代器变量时出现的意外行为。执行时,它不会打印“Hi String”、“Hi Single”和“Hi Int32”,而是为所有三种方法打印“Hi Int32”。
此行为源于lambda 表达式及其捕获变量的性质。当在循环内定义 lambda 表达式时,它捕获循环变量的引用,而不是其值。因此,它在整个循环迭代中引用同一个变量。
在提供的代码中,变量类型由 lambda 表达式捕获。但是,该代码没有考虑到循环的所有迭代之间将共享对类型的相同引用这一事实。因此,每个 lambda 表达式最终都会捕获上次迭代中的 type 值,从而导致意外的打印输出。
要解决此问题并实现预期目标,您需要确保每个 lambda 表达式捕获一个唯一的类型值。为此,请为每次迭代创建一个新变量,为其分配类型的当前值:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
通过使用 newType,您可以有效地创建类型的副本,从当前迭代捕获其值。这可确保每个 lambda 表达式对其自身类型值都有唯一的引用,从而产生正确的输出。
以上是为什么我的 Lambda 表达式捕获循环变量的最后一个值?的详细内容。更多信息请关注PHP中文网其他相关文章!