2010-10-13 18 views
9

Penso di ricordare di aver visto qualcosa di simile allo ?: ternary operator in C# che aveva solo due parti e avrebbe restituito il valore della variabile se non era nullo e un valore predefinito se lo era. Qualcosa di simile a questo:Operatore di coalizzamento in C#?

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default"; 

In sostanza l'equivalente di questo:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default"; 

Fa una cosa del genere esiste o ho appena immaginare di vedere questo da qualche parte?

+1

Possibile duplicato -> http: // stackoverflow.it/questions/463155/how-does-the-ternary-operator-work –

+3

@Junior ma si tratta dell'operatore ternario mentre si tratta dell'operatore coalescente (nonostante il titolo) – Rup

+1

@Junior, mentre il titolo della mia domanda è un Poco fuorviante se leggi la mia domanda vedrai che non ha nulla a che fare con il duplicato che hai suggerito. –

risposta

3

divertente hai usato "?? qualche operatore QUI ??", in quanto l'operatore che stai cercando è "??", vale a dire:

tb_MyTextBox.Text = o.Member ?? "default"; 

http://msdn.microsoft.com/en-us/library/ms173224.aspx

+1

Heh, deve essere stato il mio subconscio proteso verso l'esterno. Sapevo che l'avevo visto da qualche parte. –

17

Beh, non è proprio la stessa cosa come il conditional operator, ma credo che tu stia pensando al null coalescing operator (??). (Suppongo tu abbia detto che era "simile" :) Si noti che "ternario" si riferisce semplicemente al numero di operandi dell'operatore - così mentre l'operatore condizionale è un operatore ternario, l'operatore a coalescenza nulla è un operatore binario.

Ci vuole ampiamente questa forma:

result = first ?? second; 

Qui second saranno valutati solo se first è nullo. Non deve essere l'obiettivo di un compito - potresti usarlo per valutare un argomento del metodo, per esempio.

Si noti che il primo operando ha il valore n. da annullabile, ma il secondo no. Sebbene vi siano alcuni dettagli specifici relativi alle conversioni, nel caso semplice il tipo dell'espressione generale è il tipo del secondo operando. A causa di associatività, è possibile impilare usi dell'operatore ordinatamente troppo:

int? x = GetValueForX(); 
int? y = GetValueForY(); 
int z = GetValueForZ(); 

int result = x ?? y ?? z; 

Si noti come x e y sono annullabile, ma z e result non lo sono. Naturalmente, potrebbe essere essere nullable, ma quindi result dovrebbe essere nullable troppo.

Fondamentalmente gli operandi verranno valutati nell'ordine in cui appaiono nel codice, con la valutazione che si arresta quando trova un valore non nullo.

Oh, e sebbene quanto sopra sia mostrato in termini di tipi di valore, funziona anche con tipi di riferimento (che sono sempre nullable).