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#的不同语言版本,实际上所有编译器的最后版本都受限制,如果是这样,这个决定的原因是什么?