2011-11-29 24 views
9

Esto generará una excepción de referencia nula cuando InnerException sea nula.¿Por qué arroja una excepción de referencia nula?

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

pero esto no:

String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message); 

Tanto de la construcción por encima de bien. No puedo descifrar qué está tratando de hacer el primero que lo haría evaluar e.InnerException.Message. ¿Por qué no son equivalentes?

Respuesta

22

Esto se debe a que su primera afirmación está evaluando " inner exception: " + e.InnerException == null para que sea o false. Se trata de precedencia de operador, por lo que el segundo funciona bien debido a los paréntesis (( y).

See this reference for Operator Precedence. El operador + se evalúa antes que el operador de igualdad ==.

+0

Es por eso que es mejor incluir los corchetes en casos no obvios para que no tenga que pensar en la precedencia del operador. – Malcolm

+0

@Malcolm Estoy totalmente de acuerdo. –

4

Se debe a la precedencia del operador, en este caso el operador + tiene mayor prioridad que el operador ==, por lo que debe usar paréntesis para anular el orden de prioridad predeterminado para que el código se ejecute en el orden correcto.

Puede leer todos los detalles en la especificación de lenguaje C#:

Operator precedence and associativity

Cuando una expresión contiene múltiples operadores, la precedencia de los operadores controla el orden en el que los operadores individuales son evaluados .

3

Este:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

probablemente se está evaluando de esta manera:

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message; 
2

Orden de operaciones:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

se evalúa como (" inner exception: " + e.InnerException) == null ? la que no lo es.

Cuestiones relacionadas