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

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)

(是的,我确实在真正的项目上工作了.)

pan*_*ral 8

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

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

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

希望这可以帮助.