C#编译器错误? 用于Expression中的只写属性的对象初始化程序语法使csc崩溃

您可能会认为这是一个错误报告,但是我很好奇我是否在这里非常错误,或者是否有来自Eric或Microsoft的其他人的解释。

更新

现在,这是作为 Microsoft Connect上的错误发布的 。

描述

考虑以下课程:

class A { public object B { set { } } } 

这里, AB是一个只写但其他方面很好的属性。
现在,想象一下我们在表达式中分配它

 Expression<Func> expr = () => new A { B = new object { } }; 

此代码使C#编译器( 3.5 .30729.4926和4.0 .30319.1)吐出

内部编译器错误(地址013E213F处的0xc0000005):可能的罪魁祸首是“BIND”。

和崩溃。

但是, 仅使用构造函数( ( ) )替换对象初始化程序语法( { } )就可以了

完整的复制代码:

 using System; using System.Linq.Expressions; class Test { public static void Main() { Expression<Func> expr = () => new A { B = new object { } }; } } class A { public object B { set { } } } 

(是的,我确实打了一个真正的项目。)

我担心我不是Eric Lippert(哦,但我可能会如此潇洒……),但作为一名前Visual Studio语言的人仍然可以搜索来源,我可以说两件事情:

  1. 每当你看到以“内部编译器错误”开头的内容时,你肯定发现了一个错误。 这就是错误的存在,无论是C#,VB还是C ++编译器。 这就是“噢,不管怎样,事情出乎意料地错了!” 抛出我们的手和纾困错误。

  2. 除此之外,这绝对是应该报告的C#编译器中的错误。 正在崩溃的代码假设当你在一个属性上做一个初始化器,它有一个可以看到的getter,嘿,猜猜是什么? 在这种情况下,没有。 奇怪的是,如果我将构造的类型更改为某种类型的“C”而不是“对象”,我不会得到崩溃,所以我猜测它是堆栈中的失败(即代码永远不应该得到)到了寻找物业吸气剂的地步)。

希望这可以帮助。

这是我在网上发现的与错误有关的内容,

微软于2010年3月9日上午10:58发布

谢谢大家的报道。 我相信此问题已在RC后修复。 问题是C#编译器在尝试报告错误或警告时崩溃。 在一些情况下,我们已经看到报告的警告是LIB环境变量包含无效路径。 要避免崩溃,请检查LIB环境变量是否包含有效路径。

问候,

Ed Maurer开发经理,VB和C#编译器