C#4.0编译器崩溃
无法编译。有什么解决办法吗C#4.0编译器崩溃,c#,compiler-construction,crash,C#,Compiler Construction,Crash,无法编译。有什么解决办法吗 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[]
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);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
使用church=Func;
班级计划
{
静态void Main(字符串[]参数)
{
真教堂=(a,b)=>a;
教堂假=(a,b)=>b;
Func和=(x,y)=>x(y(真,假),假);
}
}
}
错误6内部编译器错误(地址5476A4CC处的0xc0000005):可能的罪魁祸首是“emittel”。编译器中发生内部错误。要解决此问题,请尝试在下面列出的位置附近简化或更改程序。列表顶部的位置更靠近发生内部错误的点。可以使用/errorreport选项向Microsoft报告此类错误。测试应用
我使用VS2010(WinXP 64)复制了崩溃 两个变通办法: 1.不要使用别名使用
以下代码可在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);
}
}
}
这是在linux上测试的
您可以在Windows.NET上运行使用mono创建的二进制文件李>
Mono编译器附带安装程序MSI,并在Windows上运行
编辑:我现在已经设法复制了它,我有一个潜在的解决办法
这项工作:
csc Test.cs
这并不是:
csc /debug+ Test.cs
所以看起来这是调试信息的问题。如果在你的特定场景中,你可以不使用它,那么你就可以继续
编辑:我刚刚测试过,这也发生在/debug:pdbonly
上
编辑:万一有人想知道,我会打电话给埃里克·利珀特
编辑:这是我发现的最小复制:
using church = System.Func<dynamic>;
class Program
{
static void Main() {}
}
使用church=System.Func;
班级计划
{
静态void Main(){}
}
这里还有另一个解决方法:不要使用Func
,使用一个好的旧委托类型
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);
}
}
公共代表动态教堂(动态x、动态y);
班级计划{
静态void Main(字符串[]参数){
真教堂=(a,b)=>a;
教堂假=(a,b)=>b;
Func和=(x,y)=>x(y(真,假),假);
}
}
这也有好处,Church在任何地方都有定义,而不仅仅是使用alias的每个文件。显然这是一个编译器错误
我向我们的一位测试人员提到了这一点,他说:
我很高兴地报告,这已经被修复,您将在下一版本的VS中看到此修复。您将在Visual Studio的BUILD Developer预览中看到此修复
对此错误深表歉意,并感谢您提醒我们注意此问题。它似乎是任何在using语句中包含“dynamic”的泛型,用于创建类型别名。Sweet find。您也可以不使用类型别名(使用
),我怀疑问题在于lambda中的隐含属性没有任何地方可去,因为lambda没有实际使用;因此,下一个方法(在本例中为Main()
)突然出现堆栈不平衡或类似情况。当然,实际上并不了解编译器的内部结构,这是一种暗中操作。此外,我们总是使用委托,但这并不重要<代码>使用崩溃=列表
也会崩溃。请注意我对Jon Skeet回答的评论:代理是无关的<代码>使用崩溃=列表代码>也将崩溃。@EricLippert该错误仍然存在于VS 2012 v11.0.61030.00更新4“不要使用Func,使用一个好的旧委托类型”@larsw:我的意思是使用非泛型委托类型。如我在示例中所示。
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);
}
}