[英]Why does this nested object initializer throw a null reference exception?
以下測試用例在嘗試將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();
}
}
所以Header
可以由某人/某事初始化。 解決是否某人/某事將初始化Header
是一個復雜的問題(可能類似於Halting問題)...不是編譯器想要為你解決的問題:-)
從C#規范:
在等號后面指定對象初始值設定項的成員初始值設定項是嵌套對象初始值設定項,即嵌入對象的初始化。 而不是為字段或屬性分配新值,嵌套對象初始值設定項中的賦值被視為對字段或屬性成員的賦值 。 嵌套對象初始值設定項不能應用於具有值類型的屬性,也不能應用於具有值類型的只讀字段。
我們是嵌套初始化器的情況,並看到粗體部分。 我不知道。
現在,請注意,根據C#規范, new R { }
是7.6.10.1 Object creation expressions
后跟object-initializer
,而Header = { }
是“純” 7.6.10.2 Object initializers
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.