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

时间:2015-05-18 19:34:21

标签: c# visual-studio-2013 c#-5.0

C#5引入了对foreach语句中循环变量的闭包方式的重大改变,这是众所周知的(详情可以在Eric Lippert的this文章中找到)。我想在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()
        {

        }        
    }
}

使用C#5编译器进行编译时,显然会打印

110
120
130

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

130
130
130

正如我所料。

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

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

0 个答案:

没有答案