Dos signos de interrogación en C#: qué son y cómo usarlos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Dos signos de interrogación en C#: no es un error, sino una herramienta poderosa

\n\n

Imagina: estás escribiendo código en C# y de repente ves la construcción ??. El primer pensamiento: ¿un error tipográfico? ¿Un signo de más? En realidad, es uno de los operadores más elegantes y útiles del lenguaje: el operador de unión nula (null-coalescing operator). Si alguna vez te has topado con un NullReferenceException y has maldecido todo a tu alrededor, este operador será tu salvavidas.

\n\n

En este artículo, analizaremos qué significan dos signos de interrogación en C#, cómo usarlos correctamente, en qué se diferencian del operador ternario y mostraremos ejemplos reales de la práctica. ¡Allá vamos!

\n\n

¿Qué es el operador ?? en C#?

\n\n

El operador ?? (dos signos de interrogación) es un operador binario que devuelve el operando izquierdo si no es null; de lo contrario, devuelve el operando derecho. En pocas palabras: "Si lo de la izquierda no es null, toma lo de la izquierda; si no, toma lo de la derecha".

\n\n

La sintaxis es extremadamente simple:

\n\n
var result = left ?? right;
\n\n

Donde:

\n
    \n
  • left — el valor que puede ser null;
  • \n
  • right — el valor por defecto (no puede ser null si el tipo de la derecha es nullable).
  • \n
\n\n

Primer ejemplo: salvándonos de null

\n\n

Supongamos que tienes una variable string? name (cadena nullable). Quieres mostrar el nombre del usuario y, si no tiene, "Invitado":

\n\n
string? name = GetUserName(); // puede devolver null\nstring displayName = name ?? "Invitado";\nConsole.WriteLine(displayName);
\n\n

Sin el operador ??, tendrías que escribir:

\n\n
string displayName = (name != null) ? name : "Invitado";
\n\n

¿Estás de acuerdo en que la primera opción se lee como una frase normal: "nombre o invitado"? Bonito, ¿verdad?

\n\n

Operador ??=: la nueva generación de unión nula

\n\n

A partir de C# 8.0, apareció el operador ??=: una forma abreviada de asignación con unión nula. Asigna el valor del operando derecho al izquierdo solo si el operando izquierdo es null.

\n\n

Sintaxis:

\n\n
left ??= right;
\n\n

Esto es equivalente a:

\n\n
if (left == null) left = right;
\n\n

Ejemplo con ??=

\n\n
List<int>? numbers = null;\nnumbers ??= new List<int>(); // numbers ahora = new List<int>()\nnumbers.Add(42);\nConsole.WriteLine(numbers.Count); // 1
\n\n

Observa: si numbers ya estuviera inicializado (no null), no se produciría la asignación. Esto es ideal para la inicialización diferida.

\n\n

Comparación con el operador ternario (? :)

\n\n

Muchos principiantes confunden ?? con el operador ternario ? :. Aclaremos esto de una vez por todas:

\n\n
    \n
  • Operador ternario — es una forma abreviada de if-else. Verifica CUALQUIER condición booleana: condición ? valor_si_true : valor_si_false.
  • \n
  • Operador ?? — verifica SOLO si es null. Es un caso particular, diseñado para una tarea específica.
  • \n
\n\n

Ejemplo del operador ternario:

\n\n
int age = 18;\nstring status = (age >= 18) ? "Adulto" : "Menor de edad";
\n\n

Y esto es lo que sucede si intentas reemplazar ?? con el ternario:

\n\n
string? name = null;\nstring displayName = name != null ? name : "Invitado"; // funciona, pero es más largo\nstring displayName2 = name ?? "Invitado"; // más corto y claro
\n\n

Conclusión: usa ?? cuando solo necesites sustituir un valor por defecto en lugar de null. Para todas las demás condiciones, usa el operador ternario.

\n\n

Cadena de operadores ??

\n\n

Puedes encadenar varios operadores ?? en una secuencia. Esto es útil cuando hay varias fuentes posibles de un valor:

\n\n
string? firstChoice = GetFromCache                

Blogs

Book Recommendations