关于c#:为什么不同版本的Visual Studio会输出相同代码的不同结果?

Why different versions of Visual Studio will output different result of the same code?

本问题已经有最佳答案,请猛点这里访问。

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

为什么不同版本的Visual Studio会使用相同的.NET框架输出相同代码的不同结果?

我有以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(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# Compiler version 4.0.30319.33440
for Microsoft (R) .NET Framework 4.5

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>csc /?
Microsoft (R) Visual C# Compiler version 4.0.30319.33440
for Microsoft (R) .NET Framework 4.5

C:\Program Files (x86)\Microsoft Visual Studio 12.0>csc /?
Microsoft (R) Visual C# Compiler version 12.0.30110.0
for C# 5

编辑

我可以这么说吗?

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

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


来自埃里克·利珀特的博客:

In C# 5, the loop variable of a foreach will be logically inside the
loop, and therefore closures will close over a fresh copy of the
variable each time.

以及一份来自msdn的报价:

Visual Studio 2010 will not let you develop using C# 5. The new C# 5
language features are part of the compiler, and will be included in
the Visual Studio 2012 compiler. Even if you install .NET 4.5, this
will not let you take advantage of the new features of the language
(such as async/await), as these require a new compiler to use.

VS2013只与C# 5.0编译器一起工作,您可以针对各种.NET框架。因此,您可以使用get c_5.0特性,如async/await,并且仍然以.NET 4.0为目标。