2012-02-05 16 views

Respuesta

10

¿Por qué es fácil; piensa en lo que has escrito como estar realmente presente:

object o = null; 
Console.WriteLine(("Is null: " + o) == null); // returns false 

Es la prueba "Is null: " + o contra null, que siempre será false. Esto se debe a las reglas de precedencia del operador, donde + viene antes de ==.

Usted debe solicitar explícitamente parens para asegurarse de que está funcionando como usted quiere:

Console.WriteLine("Is null: " + (o == null)); // returns true 

Como se señaló en los comentarios por Jim Rhodes:

Ésta es una de las varias razones por las que debe utilizar siempre entre paréntesis y nunca confíe en las reglas de precedencia del compilador.

Me di cuenta de que estoy de acuerdo; que ni siquiera intento para recordar las reglas de precedencia del operador yo mismo, en lugar de ser explícito con parens todo el tiempo. Sugiero además que esta es también una de las razones para tener mucho cuidado al confiar en la conversión de tipo implícito y/o métodos con múltiples sobrecargas.

También me gustaría señalar que realmente me gusta algo Ravadre observado en their answer; sobre por qué solo se imprimió "False", y no todo el texto que intentaba imprimir.

+3

Esta es una de varias razones por las que SIEMPRE debe usar paréntesis y nunca confiar en las reglas de precedencia del compilador. –

+1

@JimRhodes De hecho; Ni siquiera trato de recordar las reglas de precedencia del operador yo mismo. Si podría * posiblemente * ser un problema, explícitamente indicaré la prioridad en mi código. Este ejemplo es * también * un caso que muestra que confiar en una conversión de tipo explícita puede causar confusión. –

11

Precedente del operador.

Trate

Console.WriteLine("Is null: " + (o == null)); 

En su código, se añade en primer o-"Is null: " cadena, que se comprueba si es nulo. Por supuesto que no, por lo que se evalúa como falso. Su llamada es el mismo que si usted acaba de escribir

Console.WriteLine(false.ToString()); 

Es por esto que sólo se imprime "falso", incluso sin su cadena.

+0

Bueno, además, observa cómo solo se muestra "False", y no "Es nulo: falso" –

8

Las otras respuestas han diagnosticado correctamente el problema: la precedencia del operador es mayor para la concatenación que para la igualdad. Sin embargo, lo que nadie ha abordado es el error más fundamental en su programa, que es que está haciendo una concatenación. Una mejor manera de escribir el código es:

Console.WriteLine("is null: {0}", obj == null); 

Ahora no puede posiblemente ser un problema de prioridad de los operadores debido a la expresión en cuestión sólo tiene un único operador.

En general, debe evitar la concatenación de cadenas y favorecer la sustitución de cadenas al realizar la salida. Es más fácil hacerlo bien, es mucho más flexible, es más fácil localizar programas escritos usando esta técnica, y así sucesivamente.

+0

Sin embargo, si la concatenación no incluye expresiones (solo variables, puede ser incluso constantes) y es corta y simple? En muchos casos, la concatenación es más corta, más clara y funciona mejor. ¿Qué piensas sobre estos argumentos? – Konstantin

Cuestiones relacionadas