2015-10-01 7 views
7

Ho appena notato che la seguente è possibile in C# scritto in Visual Studio 2015, ma non ho mai visto prima:Nuova sintassi di inizializzazione dell'oggetto C# 6?

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 } }; 
} 

La mia aspettativa era per Foo dover essere implementato in questo modo:

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

Si noti che non è necessario chiamare new Y.

È questo nuovo in C# 6? Non ho visto alcuna menzione di questo nel release notes, quindi forse è sempre stato lì?

+0

Possibile duplicato (http://stackoverflow.com/questions/32342188/c-sharp- object-initialization-bug) –

risposta

11

Otterrete una NullReferenceException se eseguite questo codice.

non creerà un'istanza Y, chiamerà la getter X.B proprietà e tentare di assegnare valore alla struttura C.

Funzionava sempre così. Secondo C# 5.0 specifica del linguaggio:

Un inizializzatore membro che specifica un inizializzatore oggetto dopo il segno di uguale è un inizializzatore di oggetto nidificato, vale a dire un'inizializzazione di un oggetto incorporato. Invece di assegnare un nuovo valore al campo o alla proprietà, le assegnazioni nell'inizializzatore dell'oggetto nidificato vengono trattate come assegnazioni ai membri del campo o della proprietà.

+0

Hai ragione, grazie. Quindi possiamo cambiare la dichiarazione di 'X.B' in modo che assomigli a' public Y B {get; } = new Y(); 'e questo codice funzionerà come previsto. Strano che non abbia mai notato prima questa sintassi! – jonnystoten

+2

Questa funzione è stata introdotta in C# 3.0 – Vova

6

Questa funzione è stata introdotta in C# 3.0 come inizializzatori di oggetti.

Vedere l'esempio a p. 169 del C# Language 3.0 specification: [? C# oggetto di inizializzazione bug]

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

che ha lo stesso effetto di

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