簡體   English   中英

新的C#6對象初始化程序語法?

[英]New C# 6 object initializer syntax?

我剛剛注意到在Visual Studio 2015中編寫的C#中可以使用以下內容,但我以前從未見過它:

public class X
{
    public int A { get; set; }

    public Y B { get; set; }
}

public class Y
{
    public int C {get; set; }
}

public void Foo()
{
    var x = new X { A = 1, B = { C = 3 } };
}

我的期望是Foo必須像這樣實現:

public void Foo()
{
    var x = new X { A = 1, B = new Y { C = 3 } };
}

請注意,無需調用new Y

這是C#6中的新功能嗎? 我在發行說明中沒有看到任何提及,所以也許它一直在那里?

如果運行此代碼,您將收到NullReferenceException。

它不會創建Y的實例,它將調用XB屬性的getter並嘗試為屬性C賦值。

它總是像那樣工作。 根據C#5.0語言規范:

在等號后面指定對象初始值設定項的成員初始值設定項是嵌套對象初始值設定項,即嵌入對象的初始化。 而不是為字段或屬性分配新值,嵌套對象初始值設定項中的賦值被視為對字段或屬性成員的賦值。

此功能在C#3.0中作為對象初始化程序引入。

見第2頁的例子。 C#語言3.0規范的 169:

Rectangle r = new Rectangle {
    P1 = { X = 0, Y = 1 },
    P2 = { X = 2, Y = 3 }
};

效果與...相同

Rectangle __r = new Rectangle();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
Rectangle r = __r;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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