为什么不同版本的Visual Studio会输出相同代码的不同结果?

ser*_*hio 7 .net c# visual-studio-2010 visual-studio visual-studio-2013

我使用.NET 4(不是.NET 4.5或任何其他版本的框架!)

为什么不同版本的Visual Studio将使用SAME .NET Framework输出相同代码的不同结果?

我有以下内容

static void Main(string[] args)
{
    var values = new List<int>() { 1, 2, 3, 4, 5 };
    var funcs = new List<Func<int>>();

    foreach (var v in values) {
        funcs.Add(() => v * 10);
    }

    foreach (var f in funcs) {
        Console.WriteLine(f());
    }

    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

在Visual Studio 2013中,输出为10 20 30 40 50(Target .NET v == 4).
在Visual Studio 2010中,输出为50 50 50 50 50(Target .NET v == 4).

问题出在哪儿?如何识别C# (而不是.NET!)版本各自所采用Studio.NET 4

C:\ Windows\Microsoft.NET\Framework\v4.0.30319> csc /?
Microsoft(R)Visual C#编译器版本4.0.30319.33440(
适用于Microsoft(R).NET Framework 4.5)

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\VC> csc /?
Microsoft(R)Visual C#编译器版本4 .0.30319.33440(
适用于Microsoft(R).NET Framework 4.5)

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 > csc /? 用于C#5的
Microsoft(R)Visual C#编译器版本12 .0.30110.0

编辑

我可以这么说吗

VS 2010 == C# 4
VS 2013 == C# 5
Run Code Online (Sandbox Code Playgroud)

这与具体解决方案的目标框架无关?

Ofi*_*ris 9

来自Eric Lippert的博文:

在C#5中,foreach的循环变量将在逻辑上位于循环内部,因此闭包每次都会关闭变量的新副本.

来自MSDN的引用:

Visual Studio 2010不允许您使用C#5进行开发.新的C#5语言功能是编译器的一部分,将包含在Visual Studio 2012编译器中.即使您安装了.NET 4.5,也不会让您利用该语言的新功能(例如async/await),因为这些需要使用新的编译器.

VS2013仅适用于C# 5.0编译器,您可以定位各种.NET框架.因此,您可以使用async/await之类的获取C#5.0功能,并仍然以.NET 4.0为目标.

  • @serhio:对,对.VS2013仅适用于C#5.0编译器,您可以定位各种.NET框架.因此,您可以使用像`async/await`这样的get C#5.0功能,并且仍然以.NET 4.0为目标. (3认同)
  • @serhio:要获取`async/await`所需的类型,请添加NuGet包Microsoft.Bcl.Async.请参阅http://stackoverflow.com/questions/22060691/how-microsoft-bcl-async-works (2认同)