这个嵌套对象初始化器为什么会抛出空引用异常?以下测试用例在尝试将Id分配给空对象时抛出空引用异常,因为代码在对象初始值设定项之前缺少“newR”。为什么这不被编译器捕获?为什么用例是允许这样做的有意义的构造?[TestClass]publicclassThrowAway{publicclassH{publicintId{get;放;}}publicclassR{publicHHeader{get;放;}}[TestMethod]publicvoidThrowsException(){varrequest=newR{Header={Id=1},};}}编译器不会发出警告,因为你可以:publicclassR{publicHHeader{get;放;}publicR(){Header=newH();所以Header可以被某人/某事初始化。解决某人/某事是否会初始化Header是一个复杂的问题(可能类似于停止问题)...不是编译器想要为您解决的问题:-)来自C#规范:SpecifyingobjectinitializersaftertheequalsignsetsA定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化。嵌套对象初始值设定项中的赋值被视为对字段或属性成员的赋值,而不是将新值赋给字段或属性。嵌套对象初始值设定项不能应用于具有值类型的属性,也不能应用于具有值类型的只读字段。我们是嵌套初始化器的情况,看到粗体部分。我不知道。现在,请注意,根据C#规范,newR{}是7.6.10.1对象创建表达式,后跟对象初始化器,而Header={}是“纯”7.6.10.2对象初始化器。以上是C#学习教程:Whydoesthisnestedobjectinitializerthrowanullreferenceexception?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
