2012-10-03 36 views
19

En C#, si escriboEl operador + = con tipos anulables en C#

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

que sería de esperar que esto sea equivalente a:

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

Y así en el primer ejemplo, x lo haría contiene 1 como en el segundo ejemplo. Pero no es así, contiene nulo. El operador + = no parece funcionar en tipos anulables cuando no se han asignado. ¿Porqué debería ser este el caso?

Editar: Como se señaló, es porque null + 1 = null y la precedencia del operador. En mi defensa, creo que esta línea en el MSDN es ambigua !:

Los operadores unarios y binarios predefinidos y cualquier operadores definidos por el usuario que existen para los tipos de valor también puede ser utilizada por anulables tipos. Estos operadores producen un valor nulo si [cualquiera de] los operandos son nulos; de lo contrario, el operador usa el valor contenido en para calcular el resultado.

Respuesta

33

Aquí es la diferencia entre las dos afirmaciones:

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

El segundo no es lo que estabas esperando.

He aquí un desglose de los dos:

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, la precedencia de operadores, mi antiguo enemigo. ¡Golpeas de nuevo! – JDB

+0

¿'' 'no tiene precedencia sobre' + '? (Respuesta de @Servy) –

+4

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

Cuestiones relacionadas