[英]C# nested object initializer
C#5.0語言規范7.6.10.2 對象初始化程序指出
在等號后指定對象初始化器的成員初始化器是嵌套的對象初始化器,即嵌入式對象的初始化。 而不是為字段或屬性分配新值,而是將嵌套對象初始化器中的分配視為對字段或屬性成員的分配。 嵌套對象初始化程序不能應用於具有值類型的屬性 ,也不能應用於具有值類型的只讀字段 。
雖然我理解構造函數運行后初始化程序無法修改只讀字段,但我對屬性的限制一無所知。
以下是我用於測試此屬性限制的代碼示例:
using System;
namespace ObjectCollectionInitializerExample
{
struct MemberStruct
{
public int field1;
public double field2;
}
class ContainingClass
{
int field;
MemberStruct ms;
public int Field
{
get { return field; }
set { field = value; }
}
public MemberStruct MS
{
get { return ms; }
set { ms = value; }
}
}
class Program
{
static void Main(string[] args)
{
// Nested object initializer applied to a property of value type compiles!
ContainingClass cc = new ContainingClass { Field = 1, MS = new MemberStruct { field1 = 1, field2 = 1.2} };
Console.ReadKey();
}
}
}
我評論了根據規范應該在其中生成編譯器錯誤的代碼。 但是它編譯成功。 我在這里想念什么?
謝謝
您擁有的不是嵌套對象初始化程序,因為您顯式創建了MemberStruct的新實例。 內部對象初始值設定項不直接跟等號,而是一個單獨的對象初始值設定項,與對MemberStruct構造函數的調用相關聯。
這就是使用嵌套對象初始化程序的樣子:
ContainingClass cc = new ContainingClass { Field = 1, MS = { field1 = 1, field2 = 1.2} };
如果MS是值類型(結構),則不會編譯,但是如果MS是引用類型(對象),則它將編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.