您可能会认为这是一个错误报告,但是我很好奇我在这里是否犯了严重错误,或者 Eric 或 Microsoft 的其他人是否有解释。
这现已作为错误发布在 Microsoft Connect 上。
考虑以下课程:
class A
{
public object B {
set { }
}
}
这里,
A.B
是一个只写,但其他方面都很好的属性。Expression<Func<A>> expr =
() => new A {
B = new object { }
};
此代码使 C# 编译器(3.5.30729.4926 和 4.0.30319.1)吐出
内部编译器错误(0xc0000005,地址 013E213F):可能的罪魁祸首是“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 { } }
}
(是的,我确实在一个真实的项目中成功了。)
恐怕我不是 Eric Lippert(哦,但我能这么潇洒吗……),但作为一个仍然可以搜索源代码的前 Visual Studio 语言人员,我可以对此说两件事:
每当您看到以“内部编译器错误”开头的内容时,您肯定发现了一个错误。这就是该错误存在的原因,无论是 C#、VB 还是 C++ 编译器。这是“哦,糟糕,刚刚发生了出乎意料的错误!”抛出我们的手和保释错误。
除此之外,这绝对是 C# 编译器中应该报告的错误。崩溃的代码假设当你对一个属性进行初始化时,它可以查看一个 getter,然后,嘿,你猜怎么着?在这种情况下,没有。奇怪的是,如果我将构造的类型更改为某种类型“C”而不是“对象”,我不会崩溃,所以我猜测这是堆栈上层的失败(即代码永远不应该得到)一直到它寻找属性获取器的地方)。
希望这有帮助。
这是我在网上找到的与错误相关的内容,
由 Microsoft 于 2010 年 3 月 9 日上午 10:58 发布
感谢大家的报告。我 相信这个问题已经得到解决 RC 后。问题是 C# 编译器正在崩溃,因为它试图 报告错误或警告。在几个 我们看到警告的情况是 报道称LIB环境 变量包含无效路径。到 避免崩溃,检查你的 LIB 环境变量包含有效的 路径。
问候,
Ed Maurer 开发经理,VB 和 C# 编译器