Dan*_*mov 26 c# compiler-construction expression-trees writeonly compiler-bug
您可能会认为这是一个错误报告,但是我很好奇我是否在这里非常错误,或者是否有来自Eric或Microsoft的其他人的解释.
现在,这是作为 Microsoft Connect上的错误发布的.
考虑以下课程:
class A
{
public object B {
set { }
}
}
Run Code Online (Sandbox Code Playgroud)
这里A.B是一个只写但其他方面很好的属性.
现在,想象一下我们在表达式中分配它:
Expression<Func<A>> expr =
() => new A {
B = new object { }
};
Run Code Online (Sandbox Code Playgroud)
此代码使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<A>> expr =
() => new A {
B = new object { }
};
}
}
class A {
public object B { set { } }
}
Run Code Online (Sandbox Code Playgroud)
(是的,我确实在真正的项目上工作了.)
我担心我不是Eric Lippert(哦,但我可能会如此潇洒......),但作为一名仍然可以搜索来源的Visual Studio语言人,我可以说两件事:
每当你看到以"内部编译器错误"开头的内容时,你肯定发现了一个错误.这就是错误的存在,无论是C#,VB还是C++编译器.这就是"噢,不管怎样,事情出乎意料地错了!" 抛出我们的手和纾困错误.
除此之外,这绝对是应该报告的C#编译器中的错误.正在崩溃的代码假设当你在一个属性上做一个初始化器时,它可以看到一个getter,嘿,猜猜是什么?在这种情况下,没有.奇怪的是,如果我将构造的类型更改为某种类型的"C"而不是"object",我不会得到崩溃,所以我猜测它是堆栈中的进一步失败(即代码永远不应该得到)到了寻找物业吸气剂的地步).
希望这可以帮助.