question operator operador mark empty diferente c# types null-coalescing-operator

operator - operador null c#



Operadora extraña con precedencia ??(operador de unión nula) (2)

Recientemente tuve un error extraño en el que estaba concatenando una cadena con un int? y luego agregar otra cadena después de eso.

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

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

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

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

Y luego esto resulta en un error de incompatibilidad de tipo inesperado:

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

Como lo hará este ejemplo más simple:

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

¿Alguien puede explicar cómo me funciona esto?


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

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

Primero, la cadena "foo" y el valor de cadena de x se concatenan, y si eso fuera nulo (que no puede ser), el valor de cadena de 0 y la cadena "bar" se concatenan.


El operador de unión nula tiene una precedence muy baja, por lo que su código se interpreta como:

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

En este ejemplo, ambas expresiones son cadenas, por lo que se compilan, pero no hacen lo que se desea. En tu siguiente ejemplo el lado izquierdo de la ?? 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";