欢迎来到闭包和捕获变量的世界:)
埃里克·利珀特(Eric Lippert)对这种行为有深入的解释:
基本上,捕获的是循环变量,而不是值。要获得您认为应该获得的东西,请执行以下操作:
foreach (var type in types)
{
var newType = type;
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
helloMethods.Add(sayHello);
}