以前版本的C#编译器是否只是Visual Studio中的仿真?

And*_*nov 6 c# c#-5.0 visual-studio-2013

C#5引入了重大更改到超过在循环变量工作的方式封foreach声明,即众所周知的(细节中可以找到这个文章埃里克利珀).我想在Visual Studio中看到破坏前的更改行为.为此我使用以下代码创建了一个小型控制台应用程序:

using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var values = new List<int>() { 100, 110, 120 };
            var funcs = new List<Func<int>>();
            foreach (var v in values)
                funcs.Add(() => v);
            foreach (var f in funcs)
                Console.WriteLine(f());
        }
        //this method does break compilation on C# versions that are older than C#5  
        public async void DoStuff()
        {

        }        
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用C#5编译器编译时,显然会打印出来

110
120
130
Run Code Online (Sandbox Code Playgroud)

但是在我去之后Project|Properties|Build|Advanced,将编译器更改为C#3并评论了DoStuff它仍然打印相同数字的方法,而不是

130
130
130
Run Code Online (Sandbox Code Playgroud)

正如我所料.

之后,我调查了Main两个编译器生成的方法的IL代码,它们完全相同.

所以我的问题是:我可以在Visual Studio中选择的C#的不同语言版本实际上是编译器的最后一个版本,其中某些语言功能受到限制,如果是这样,这个决定的原因是什么?