2009-02-04 6 views
14

Acabo de probar lo siguiente, la idea es concatenar las dos cadenas, sustituyendo una cadena vacía por nulos.¿Cuál es la precedencia del operador del operador C# null-coalescing (??)?

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

- Depuración (? Divertido que es imprimir, no exactamente ayudar a la legibilidad ...)

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

-> "Hola"

correcta 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?

(Al darse cuenta de que probablemente debería usar StringBuilder o String.Concat)

Gracias.

Respuesta

30

Aparte de lo que se como la precedencia a ser, lo que es de acuerdo con la ECMA, lo que es conforme a la especificación MS y lo que realmente hace csc, tengo un pequeño consejo:

No haga esto.

creo que es mucho más clara para escribir:

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

Por otra parte, dado que nulo en la concatenación de cadenas termina siendo sólo una cadena vacía de todos modos, acaba de escribir:

string c = a + b; 

EDIT: En cuanto a la precedencia documentada, tanto en el C# 3.0 spec (documento de Word) como en el 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!

+1

No me di cuenta del punto acerca de los nulos en la concatenación de cadenas. Bonito. –

+7

Es interesante que: cadena s = null cesionarios s en nulo mientras que cadena s = null + nula cesionarios s a "" – AndyM

+2

para "No haga esto", 1 no es suficiente. – Simon

5

La precedencia del operador está documentada en MSDN.

Sin embargo, la precedencia en MSDN contradice la precedencia tanto en el downloadable C# spec también de Microsoft como en el spec on ECMA. Lo cual es un poco extraño.

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

+1

Saludos. Buscando ?? en google obviamente no era el camino. Bastante molesto que es tan bajo. – AndyM

+0

Creo que esto debe ser incorrecto; consulte la referencia de ECMA, y considere: string a = null; cadena b = a ?? "foo"; ¿Qué es b? –

+1

Esa página de MSDN es definitivamente incorrecta, contradice las propias especificaciones de Microsoft. –

6

Nunca dependa de precedencia de los operadores. Siempre explícitamente especifique 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 ambigüedades. La ambigüedad es el caldo de cultivo de insectos.

+7

Defina "cuando importa". ¿La usaría para a + b * c también? Incluso si lo considera demasiado ambiguo, sospecho que hay ejemplos que podría encontrar donde sea importante, pero * todos * lo consideran obvio. Estoy de acuerdo con la idea general, pero no hasta qué punto llegarías :) –

+1

Probablemente también la use en tu ejemplo. Prefiero que me lo expliquen explícitamente que tener que pensar, incluso por un segundo. Ese segundo pensamiento da oportunidad para el error. –

+0

Después de haberme dado cuenta de cuán extremo me paro en él, eliminé el "cuando importa". A pesar de que no estaría entre corchetes x + y + z, siento que la declaración extrema aclara mi punto. –