2010-07-15 20 views
20

Recientemente tuve un error extraño cuando estaba concatenando una cadena con un int? y luego agregué otra cadena después de eso.precedencia de operador extraño con ?? (operador coalescente nulo)

Mi código era básicamente el equivalente a esto:

int? x=10; 
string s = "foo" + x ?? 0 + "bar"; 

Sorprendentemente esto ejecutará y compilar sin advertencias o errores de tipo incompatibles, al igual que esta:

int? x=10; 
string s = "foo" + x ?? "0" + "bar"; 

Y entonces esto da lugar a un error de incompatibilidad de tipo inesperado:

int? x=10; 
string s = "foo" + x ?? 0 + 12; 

Como será esto simple r ejemplo:

int? x=10; 
string s = "foo" + x ?? 0; 

¿Alguien puede explicar cómo esto me funciona?

+0

Un problema relacionado: http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression/3218268#3218268 –

+0

Y aquí hay un enlace que no hace que mi respuesta brille ... http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression – ChaosPandion

Respuesta

25

El operador coalescente nula ha precedence muy bajo lo que el código está siendo interpretado como:

int? x = 10; 
string s = ("foo" + x) ?? (0 + "bar"); 

En este ejemplo ambas expresiones son cadenas por lo que compila, pero no hacer lo que quiera. En el siguiente ejemplo, el lado izquierdo del operador ?? es una cadena, pero el lado derecho es un número entero por lo que no se compila:

int? x = 10; 
string s = ("foo" + x) ?? (0 + 12); 
// Error: Operator '??' cannot be applied to operands of type 'string' and 'int' 

La solución, por supuesto, es agregar paréntesis:

int? x = 10; 
string s = "foo" + (x ?? 0) + "bar"; 
+0

Ah, debido a la baja precedencia, los dos lados forman casi dos expresiones separadas – Earlz

+0

, esto explica por qué 'int x = 10; cadena s = "foo" + x ?? "0"; "funciona luego – Earlz

10

el ?? operador tiene menor precedence que el operador +, por lo que su expresión realmente funciona como:

string s = ("foo" + x) ?? (0 + "bar"); 

abeto st la cadena "foo" y el valor de cadena de x están concatenados, y si eso fuera nulo (que no puede ser), el valor de cadena de 0 y la cadena "bar" se concatenan.

+3

Final de foto :) 1 segundo de victoria :) –

Cuestiones relacionadas