闭包中的Foreach变量

本文关键字:变量 Foreach 闭包 | 更新日期: 2023-09-27 18:27:15

使用.net 4.0,为什么下面的代码每次都打印出"一、二、三、四、五",而不是只打印出"五"?

public void Go()
{
    List<Action> printActions = new List<Action>();
    String[] strings = new[] {"one", "two", "three", "four", "five"};
    foreach (String s in strings)
        printActions.Add(() => Console.WriteLine(s));
    foreach (Action printAction in printActions)
        printAction();
}

据我所知,使用旧版本的.net,我应该会遇到这里解决的问题(在闭包中使用foreach变量),但在这种情况下,代码似乎可以工作。

闭包中的Foreach变量

.Net 4.0在这里无关紧要。唯一的问题是c编译器。从C#5.0开始,行为发生了变化。我认为您使用的是C#5.0编译器。

这意味着,即使在.Net 2.0中,如果您使用Visual studio 2012(假设默认的C#编译器版本是5.0),该代码也可以工作

如果您使用的是Visual studio 2012或更新版本,默认情况下将使用C#5.0编译器,因此您不会看到错误。