当以下测试用例尝试将 Id 分配给空对象时,它会抛出空引用异常,因为代码在对象初始值设定项之前缺少“new R”。
为什么编译器没有捕获到这一点?为什么允许这样做,在哪些用例中这是一个有意义的构造?
[TestClass]
public class ThrowAway
{
public class H
{
public int Id { get; set; }
}
public class R
{
public H Header { get; set; }
}
[TestMethod]
public void ThrowsException()
{
var request = new R
{
Header =
{
Id = 1
},
};
}
}
编译器不会发出警告,因为您可能有:
public class R
{
public H Header { get; set; }
public R()
{
Header = new H();
}
}
so Header
可以由某人/某物初始化。解决某人/某物是否会初始化的问题Header
是一个复杂的问题(可能类似于停止问题)...不是编译器想要为您解决的问题:-)
从 C# 规范来看:
在等号之后指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化。嵌套对象初始值设定项中的赋值不会被视为对字段或属性分配新值,而是被视为对字段或属性成员的赋值。嵌套对象初始值设定项不能应用于具有值类型的属性,也不能应用于具有值类型的只读字段。
我们处于嵌套初始值设定项的情况下,请参阅粗体部分。我不知道。
现在,请注意new R { }
根据 C# 规范,是7.6.10.1 Object creation expressions
随后是一个object-initializer
,而Header = { }
是一个“纯粹”7.6.10.2 Object initializers
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)