2010-09-28 29 views
13

Duplicar posible:
What do two question marks together mean in C#?¿Qué hace? operador significa en C#?

Hola, yo estaba buscando algunas formaciones de MVC 2 en C# y me encontré con esta sintaxis:

ViewData["something"] = something ?? true; 

Por lo tanto, lo que es ese '??' significa?

+7

pregunta duplicados de http://stackoverflow.com/questions/446835/what-do-two-question-marks-together-mean-in-c? – Crag

+1

Lo siento, lo he buscado y no pude encontrarlo, así que lo publiqué. ¡Muchas gracias a todos ustedes! Me encanta esta página, hay una respuesta para todo: D – pjnovas

Respuesta

22

Es la null-coalescing operator.

Devuelve el primer argumento a menos que sea nula, en cuyo caso se devuelve el segundo.

x ?? y es más o menos equivalente a esto (excepto que el primer argumento se evalúa sólo una vez):

if (x == null) 
{ 
    result = y; 
} 
else 
{ 
    result = x; 
} 

O, alternativamente:

(x == null) ? y : x 

Es útil para proporcionar un valor predeterminado para cuando una valor puede ser nulo:

Color color = user.FavouriteColor ?? defaultColor; 

COALESCE

Cuando se utiliza en una LINQ a SQL consultar al operador ?? se puede traducir a una llamada a COALESCE. Por ejemplo, esta consulta LINQ:

var query = dataContext.Table1.Select(x => x.Col1 ?? "default"); 

puede dar lugar a esta consulta SQL:

SELECT COALESCE([t0].[col1],@p0) AS [value] 
FROM [dbo].[table1] AS [t0] 
+0

Algo extraño, objeto 'x = null ?? null; 'es una declaración válida. ¡Supongo que no puedes esperar que el compilador haga niñera también! – RedFilter

+0

ReSharper le advertirá de un posible NullReferenceException si hace referencia a un miembro de x después de esta declaración, pero sí, se compilará. – KeithS

+0

¡guau! ese es un buen punto jeje – pjnovas

5

Es el operador nula coalescencia. El valor de retorno es el lado izquierdo si no es nulo y el lado derecho en caso contrario. Funciona para ambos tipos de referencia y nullables

var x = "foo" ?? "bar"; // "foo" wins 
string y = null; 
var z = y ?? "bar"; // "bar" wins 
int? n = null; 
var t = n ?? 5; // 5 wins 
3

Si algo es nulo, devuelve verdadero, de lo contrario devuelve algo. Ver this link por más.