¿Qué significan dos signos de interrogación juntos en C#?

Resuelto Edward Tanguay asked hace 15 años • 18 respuestas

Me encontré con esta línea de código:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

¿Qué significan los dos signos de interrogación? ¿Es algún tipo de operador ternario? Es difícil buscar en Google.

Edward Tanguay avatar Jan 15 '09 21:01 Edward Tanguay
Aceptado

Es el operador coalescente nulo y bastante parecido al operador ternario (si inmediato). Ver también ?? Operador - MSDN .

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

se expande a:

FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();

que se expande aún más a:

if(formsAuth != null)
    FormsAuth = formsAuth;
else
    FormsAuth = new FormsAuthenticationWrapper();

En inglés, significa "Si lo que está a la izquierda no es nulo, úsalo; de lo contrario, usa lo que está a la derecha".

Tenga en cuenta que puede utilizar cualquier número de estos en secuencia. La siguiente declaración asignará el primer no nulo Answer#a Answer(si todas las respuestas son nulas, entonces Answeres nulo):

string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;

También vale la pena mencionar que si bien la expansión anterior es conceptualmente equivalente, el resultado de cada expresión solo se evalúa una vez. Esto es importante si, por ejemplo, una expresión es una llamada a un método con efectos secundarios. (Crédito a @Joey por señalar esto).

lc. avatar Jan 15 '2009 14:01 lc.

Sólo porque nadie más ha dicho las palabras mágicas todavía: es el operador coalescente nulo . Se define en la sección 7.12 de la especificación del lenguaje C# 3.0 .

Es muy útil, particularmente por la forma en que funciona cuando se usa varias veces en una expresión. Una expresión de la forma:

a ?? b ?? c ?? d

dará el resultado de la expresión asi no es nulo; de lo contrario, intente b, de lo contrario, intente c, de lo contrario, intente d. Se produce un cortocircuito en todos los puntos.

Además, si el tipo de dno admite nulos, el tipo de toda la expresión también lo será.

Jon Skeet avatar Jan 15 '2009 14:01 Jon Skeet

Es el operador coalescente nulo.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

Sí, ¡casi imposible de buscar a menos que sepas cómo se llama! :-)

EDITAR: Y esta es una característica interesante de otra pregunta. Puedes encadenarlos.

¿Características ocultas de C#?

Iain Holder avatar Jan 15 '2009 14:01 Iain Holder

Gracias a todos, aquí está la explicación más sucinta que encontré en el sitio de MSDN:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
Edward Tanguay avatar Jan 15 '2009 14:01 Edward Tanguay