C#4.0编译器崩溃

此代码示例不能被编译。 任何工作在那里?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { using church = Func<dynamic, dynamic, dynamic>; class Program { static void Main(string[] args) { church True = (a, b) => a; church False = (a, b) => b; Func<church, church, church> And = (x, y) => x(y(True, False), False); } } } 

错误6内部编译器错误 (地址5476A4CC 0xc0000005):可能的罪魁祸首是'EMITIL'。 编译器发生内部错误。 要解决此问题,请尝试简化或更改下面列出的位置附近的程序。 列表顶部的位置更接近发生内部错误的位置。 像这样的错误可以通过使用/ errorreport选项报告给Microsoft。 TestApplication

我使用VS2010(WinXP 64)重现了崩溃。

两种解决方法:

1.不要使用using别名

下面的代码在VS2010上干净地编译:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Func<dynamic, dynamic, dynamic> True = (a, b) => a; Func<dynamic, dynamic, dynamic> False = (a, b) => b; Func<Func<dynamic, dynamic, dynamic>, Func<dynamic, dynamic, dynamic>, Func<dynamic, dynamic, dynamic> > And = (x, y) => x(y(True, False), False); } } } 

2.使用单声道编译器

Mono 2.10编译器(dmcs)没有问题。

 [mono] /tmp @ dmcs test.cs test.cs(18,42): warning CS0219: The variable `And' is assigned but its value is never used Compilation succeeded - 1 warning(s) [mono] /tmp @ ./test.exe [mono] /tmp @ 

这是在linux上testing的。

  1. 您可以在Windows .NET上运行使用mono创build的二进制文件。
  2. 单声道编译器带有一个安装程序MSI,并在Windows上运行。

显然这是一个编译器错误。

我向我们的testing人员提到了这一点,他说:

我很高兴地报告,这已经被修复,你会看到在下一个版本的VS.这个修复。 实际上,您也可以在Visual Studio的BUILD开发人员预览版中看到它已经修复!

抱歉的错误,并感谢把这个引起我们的注意。

编辑:我现在设法重现它,我有一个潜在的解决方法。

这工作:

 csc Test.cs 

这不:

 csc /debug+ Test.cs 

所以看起来这是debugging信息的问题。 如果你可以在你的特定情况下没有这样的生活,你很好走…

编辑:我刚才testing,这发生在/debug:pdbonly以及…

编辑:以防万一有人想知道,我会ping艾利克·利波特关于这一点。

编辑:这是现在最小的repro我发现:

 using church = System.Func<dynamic>; class Program { static void Main() {} } 

这是另一个解决方法:不要使用Func ,使用一个很好的旧委托types。

 public delegate dynamic Church(dynamic x, dynamic y); class Program { static void Main(string[] args) { Church True = (a, b) => a; Church False = (a, b) => b; Func<Church, Church, Church> And = (x, y) => x(y(True, False), False); } } 

这也有好处,教会被定义在任何地方,而不仅仅是作为每个文件使用别名。