3 回答
TA贡献2041条经验 获得超4个赞
欢迎来到闭包和捕获变量的世界:)
埃里克·利珀特(Eric Lippert)对这种行为有深入的解释:
关闭循环变量被认为是有害的
关闭循环变量,第二部分
基本上,捕获的是循环变量,而不是值。要获得您认为应该获得的东西,请执行以下操作:
foreach (var type in types)
{
var newType = type;
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
helloMethods.Add(sayHello);
}
TA贡献1786条经验 获得超11个赞
作为暗示SWeko引用的博客文章的简要说明,lambda捕获变量而不是value。在foreach循环中,变量在每次迭代中都不是唯一的,在循环期间使用相同的变量(当您看到编译器在编译时对foreach执行的扩展时,这一点更加明显)。结果,您在每次迭代中都捕获了相同的变量,并且该变量(截至上次迭代)指的是集合中的最后一个元素。
更新:在较新版本的语言(从C#5开始)中,循环变量在每次迭代中都被视为新变量,因此关闭它不会产生与较早版本(C#4和更低版本)相同的问题。
TA贡献1906条经验 获得超10个赞
您可以通过引入其他变量来修复它:
...
foreach (var type in types)
{
var t = type;
var sayHello = new PrintHelloType(greeting => SayGreetingToType(t, greeting));
helloMethods.Add(sayHello);
}
....
- 3 回答
- 0 关注
- 715 浏览
添加回答
举报