26

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

更新

这现在作为一个错误发布在 Microsoft Connect 上。

描述

考虑以下类:

class A 
{
    public object B {
        set { }
    }
}

在这里,A.B是一个只写但其他很好的属性。
现在,假设我们在 expression 内部分配它

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 { } }
}

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

4

2 回答 2

8

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

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

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

希望这可以帮助。

于 2011-07-02T01:43:11.050 回答
0

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

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

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

问候,

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

于 2011-06-24T17:43:45.047 回答