C#编译器错误?表达式中用于只写属性的对象初始值设定项语法会导致csc崩溃

本文关键字:语法 崩溃 csc 对象 表达式 错误 编译器 用于 属性 | 更新日期: 2023-09-27 18:00:24

您可能会认为这是一份错误报告,但我很好奇我在这里是否大错特错,或者Eric或微软的其他人是否对此做出了解释。

更新

此错误现已在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.03391.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 { } }
}

(是的,我在一个真实的项目中确实做到了。)

C#编译器错误?表达式中用于只写属性的对象初始值设定项语法会导致csc崩溃

恐怕我不是Eric Lippert(哦,但我能这么潇洒吗…),但作为一个仍然可以搜索源代码的前Visual Studio语言人员,我可以对此说两件事:

  1. 每当您看到以"内部编译器错误"开头的内容时,您肯定会发现一个错误。这就是错误存在的原因,无论是C#、VB还是C++编译器。这是"哦,天哪,出了什么意外的问题!"举起我们的手,纠正错误。

  2. 除此之外,这肯定是C#编译器中应该报告的一个错误。崩溃的代码是假设当你对一个属性进行初始化时,它可以查看一个getter,嘿,你猜怎么着?在这种情况下,没有。奇怪的是,如果我将正在构建的类型更改为某种类型"C"而不是"对象",我就不会崩溃,所以我猜这是一个更高层次的失败(即,代码永远不应该降到寻找属性getter的地步)。

希望这能有所帮助。

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

由微软发布于3/9/2010上午10:58

感谢大家的报道。我相信这个问题已经解决了RC后。问题是C#编译器在尝试时崩溃报告错误或警告。在几个我们看到的警告是据报道,LIB环境变量包含无效路径。到避免崩溃,检查您的LIB环境变量包含有效的路径。

问候,

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