question operator mark logical diferente c# null null-coalescing-operator

operator - ¿Cuál es la precedencia del operador del operador C#null-coalescing(??)?



isnull c# (5)

Aparte de lo que le gustaría que fuera la precedencia, lo que es según ECMA, lo que es según las especificaciones de MS y lo que hace realmente el csc, tengo un consejo:

No hagas esto

Creo que es mucho más claro escribir:

string c = (a ?? "") + (b ?? "");

Alternativamente, dado que la nula en la concatenación de cadenas acaba siendo una cadena vacía de todos modos, solo escriba:

string c = a + b;

EDITAR: En cuanto a la precedencia documentada, tanto en la especificación C # 3.0 (documento de Word) como en ECMA-334 , la adición se une más estrictamente que ??, que se une más estrictamente que la asignación. El enlace de MSDN dado en otra respuesta es simplemente incorrecto y extraño, IMO. Hay un cambio que se muestra en la página realizada en julio de 2008 que movió el operador condicional, ¡pero al parecer incorrectamente!

Acabo de probar lo siguiente, la idea es concatenar las dos cadenas, sustituyendo una cadena vacía por nulos.

string a="Hello"; string b=" World";

- Depurar (¿divertir a eso? Es imprimir, no ayuda exactamente a la legibilidad ...)

? a ?? "" + b ?? ""

-> "Hola"

Correcto es:

? (a??"")+(b??"") "Hello World"

Esperaba un poco "Hello World", o simplemente "World" si a es nulo. Obviamente, esto es todo con la precedencia del operador y puede ser superado por corchetes, ¿hay algún lugar que documente el orden de precedencia para este nuevo operador?

(Dándome cuenta de que probablemente debería usar stringbuilder o String.Concat)

Gracias.



Nunca confíe en la precedencia del operador. Siempre especifique explícitamente cómo quiere que actúe su código. Hazte un favor a ti mismo y a los demás cuando vuelvas a tu código.

(a ?? "") + (b ?? "")

Esto no deja lugar a la ambigüedad. La ambigüedad es el caldo de cultivo de los insectos.



La precedencia del operador está documentada en MSDN .

Sin embargo, la precedencia en MSDN contradice la precedencia tanto en la especificación descargable de C # también de Microsoft como en las especificaciones de ECMA . Lo cual es un poco extraño.

Independientemente, como dijo Jon Skeet en su respuesta, lo mejor es no confiar en la precedencia de los operadores, sino ser explícito mediante el uso de corchetes.