gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:19:41 26 4
gpt4 key购买 nike

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

更新

现在是 posted as a bug在 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)吐出

Internal Compiler Error (0xc0000005 at address 013E213F): likely culprit is '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 { } }
}

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

最佳答案

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

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

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

希望这对您有所帮助。

关于C# 编译器错误?用于 Expression 中只写属性的对象初始值设定项语法使 csc 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com