2015-06-24 16 views
7

Supponiamo di avere seguente codice:Perché C# 6.0 non consente di impostare le proprietà di una struttura nullable non nulla quando si utilizza l'operatore di propagazione Null?

struct Article 
{ 
    public string Prop1 { get; set; } 
} 

Article? art = new Article(); 
art?.Prop1 = "Hi"; // compile-error 

L'errore di compilazione è

CS0131 Il lato sinistro di una cessione deve essere una variabile, proprietà o indicizzatore.

In realtà art?.Prop1 è una proprietà e deve essere considerato un compito valido!
Non vedo alcun problema con l'assegnazione di rendere questo codice non valido.

Perché C# 6.0 non consente di impostare le proprietà di una struttura nullable non nulla?
In alternativa qualsiasi suggerimento per un codice di linea per rendere valido il compito sarebbe apprezzato.

+0

Rimuovere il punto interrogativo nella tua riga 'art? .Prop1 =" Ciao ";' e il tuo compito non dovrebbe generare un errore. Rendilo 'art.Prop1 =" Ciao ";' –

+0

@ K.AlanBates Vuole in particolare utilizzare l'operatore di propagazione nullo. – Servy

+0

Le strutture sono presenti in C# solo per rendervi la vita interessante. Prova 'Elenco

articoli = nuovo Elenco
{nuovo Articolo()}; article [0] .Prop1 = "test"; '- forse riconsidererai l'uso delle strutture in quel punto :). –

risposta

16

Questo codice:

Article? art 

definirà un Nullable<Article> ma poi quando lo fai:

art?.Prop1 = "Hi"; 

questo significherà utilizzando propagazione operatore Null/condizionale.

La propagazione null/operatore condizionale serve per accedere alle proprietà, non per impostarle. Quindi non puoi usarlo.

Come @Servy detto nei commenti, il risultato dell'operatore Null condizionale è sempre un valore e non è possibile assegnare un valore a un valore, quindi l'errore.

Se si sta solo cercando di impostare la proprietà, allora non è necessario ? con il nome dell'oggetto, ? con Nullable<T> tipi viene utilizzato al momento della dichiarazione, che è zucchero sintattico per:

Nullable<Article> art; //same as Article? art 
+3

O per dire la stessa cosa più tecnicamente, il risultato dell'operatore di propagazione null è sempre un valore, mai una variabile, motivo per cui sta ricevendo l'errore dicendo che non può assegnare un valore a un valore, poiché non è un variabile. – Servy

+3

La domanda rimane perché non è permesso. Il compilatore potrebbe notare che si tratta di un compito e quindi utilizzare l'operatore di propagazione null per restituire la variabile/proprietà anziché il valore o ho trascurato qualcosa? Potrebbe essere usato per semplificare il codice omettendo i controlli null prima di eseguire un compito. –

+1

Poiché è già possibile chiamare un metodo come x? .SetValue (...), un'assegnazione di proprietà (che è la stessa cosa) dovrebbe essere un'opzione valida. Perchè no? – Vlad