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

时间:2014-04-02 13:03:26

标签: c# .net 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();
}

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

问题出在哪里?如何识别 Studio

每个.NET 4使用的 C#(不是.NET!)版本
  

C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319&gt; csc /?
  Microsoft(R)Visual C#编译器版本4.0.30319.33440
  for Microsoft(R).NET Framework 4.5

     

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC&gt; csc /?
  Microsoft(R)Visual C#编译器版本4 .0.30319.33440
  for Microsoft(R).NET Framework 4.5

     

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 &gt; csc /?
  Microsoft(R)Visual C#编译器版本12 .0.30110.0
  对于C#5

修改

我可以这么说吗

VS 2010 == C# 4
VS 2013 == C# 5

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

1 个答案:

答案 0 :(得分:9)

来自Eric Lippert&#39; blog post

  

在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为目标。