簡體   English   中英

C#嵌套對象初始化器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM