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

时间:2011-06-24 17:32:01

标签: c# compiler-construction expression-trees compiler-bug writeonly

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

更新

现在是Microsoft Connect上的posted as a bug

描述

考虑以下课程:

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)吐出

  

内部编译器错误(地址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 { } }
}

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

2 个答案:

答案 0 :(得分:8)

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

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

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

  3. 希望这有帮助。

答案 1 :(得分:0)

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

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

  

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

     

此致

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