关于Visual Studio 2010中使用的C#/.NET编译器的问题: 在项目开发过程中,同事遇到了这样一个情况,即在锁内使用现有代码时,VS2010编译器会崩溃。我们逐行分析代码,最终得出结论:在锁语句中通过foreach
遍历数组时使用yield return
会导致编译器崩溃。以下代码可以重现这个问题:
using System;
using System.Collections.Generic;
namespace PlayGround
{
public static class Program
{
private static readonly object SyncRoot = new object();
private static IEnumerable<int> EnumerableWithLock()
{
lock (SyncRoot)
{
foreach (var i in new int[1])
{
yield return i;
}
}
}
public static void Main()
{
foreach (var i in EnumerableWithLock())
{
Console.WriteLine(i);
}
}
}
}
我们在Visual Studio 2013上测试了这个复制样本,它没有出现同样的问题。这个编译器问题似乎与VS2010中使用的编译器有关,而在VS2012中可能会或可能不会出现同样的问题(我们无法访问它进行测试)。此外,我们已经测试过使用常规的
for
循环不会崩溃。因此,问题是,为什么VS2010编译器会崩溃?它到底在做什么以至于如此混乱?(是的,这主要是为了学习编译器而提出的问题。)