2012-10-03 19 views
19

In C#, se scrivoL'operatore + = con i tipi nullable in C#

int? x = null; 
x += x ?? 1 

mi si aspetterebbe che questo è equivalente a:

int? x = null; 
x = x + x ?? 1 

E così nel primo esempio, x avrebbe fatto contenere 1 come nel secondo esempio. Ma non lo fa, contiene null. L'operatore + = non sembra funzionare su tipi nullable quando non sono stati assegnati. Perché dovrebbe essere così?

Modifica: Come sottolineato, è perché null + 1 = null e la precedenza degli operatori. Nella mia difesa, ritengo questa riga nel MSDN è ambigua !:

Gli operatori unari e binari predefiniti e eventuali operatori definiti dall'utente che esistono per i tipi di valore può essere utilizzato anche da Null tipi. Questi operatori producono un valore null se [uno di] gli operandi sono nulli; in caso contrario, l'operatore utilizza il valore contenuto per calcola il risultato.

risposta

33

Ecco la differenza tra le due affermazioni:

x += x ?? 1 
x = (x + x) ?? 1 

Il secondo non è quello che ti aspettavi.

Ecco una ripartizione di entrambi:

x += x ?? 1 
x += null ?? 1 
x += 1 
x = x + 1 
x = null + 1 
x = null 

x = x + x ?? 1 
x = null + null ?? 1 
x = null ?? 1 
x = 1 
+7

+1 Ah, precedenza degli operatori, la mia antica nemico. Colpisci di nuovo! – JDB

+0

Non '??' ha la precedenza su '+'? (@ Risposta di Servy) –

+4

@AustinSalonen No. http://msdn.microsoft.com/en-us/library/6a71f45d.aspx –