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

问题描述 投票:0回答:2

您可能会认为这是一个错误报告,但是我很好奇我在这里是否犯了严重错误,或者 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 { } }
}

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

c# expression-trees compiler-bug writeonly
2个回答
8
投票

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

  1. 每当您看到以“内部编译器错误”开头的内容时,您肯定发现了一个错误。这就是该错误存在的原因,无论是 C#、VB 还是 C++ 编译器。这是“哦,糟糕,刚刚发生了出乎意料的错误!”抛出我们的手和保释错误。

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

希望这有帮助。


0
投票

这是我在网上找到的与错误相关的内容,

由 Microsoft 于 2010 年 3 月 9 日上午 10:58 发布

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

问候,

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

© www.soinside.com 2019 - 2024. All rights reserved.