?? Operadores ?? y ?? (referencia de C#)

El operador de uso combinado de NULL ?? devuelve el valor del operando izquierdo si no es null; en caso contrario, evalúa el operando derecho y devuelve su resultado. El operador ?? no evalúa su operando derecho si el operando izquierdo se evalúa como no NULL.

Disponible en C# 8.0 y versiones posteriores, el operador de asignación de uso combinado de NULL ??= asigna el valor de su operando derecho al operando izquierdo solo si el operando izquierdo se evalúa como null. El operador ??= no evalúa su operando derecho si el operando izquierdo se evalúa como no NULL.

List<int> numbers = null;
int? a = null;

(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5

numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers));  // output: 5 0
Console.WriteLine(a);  // output: 0

El operando izquierdo del operador ??= debe ser una variable, una propiedad o un elemento de indizador.

En C# 7.3 y versiones anteriores, el tipo del operando izquierdo del operador ?? debe ser un tipo de referencia o un tipo de valor que acepta valores NULL. A partir C# 8.0, ese requisito se reemplaza por lo siguiente: el tipo del operando izquierdo de los operadores ?? y ??= no puede ser un tipo de valor que no acepta valores NULL. En concreto, a partir de C# 8.0 puede usar los operadores de fusión de NULL con parámetros de tipo sin restricciones:

private static void Display<T>(T a, T backup)
{
    Console.WriteLine(a ?? backup);
}

Los operadores de uso combinado de NULL son asociativos a la derecha. Es decir, las expresiones del formulario

a ?? b ?? c
d ??= e ??= f

se evalúan como

a ?? (b ?? c)
d ??= (e ??= f)

Ejemplos

Los operadores ?? y ??= puede resultar útiles en los siguientes escenarios:

  • En expresiones con los operadores no condicionales ? y ?[], puede usar el operador ?? para proporcionar una expresión alternativa para evaluar en caso de que el resultado de la expresión con la operación condicional NULL sea null:

    double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
    {
        return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
    }
    
    var sum = SumNumbers(null, 0);
    Console.WriteLine(sum);  // output: NaN
    
  • Cuando trabaja con tipos de valor que aceptan valores NULL y necesita proporcionar un valor de un tipo de valor subyacente, use el operador ?? para especificar el valor para proporcionar en caso de que un valor de tipo que acepta valores NULL sea null:

    int? a = null;
    int b = a ?? -1;
    Console.WriteLine(b);  // output: -1
    

    Use el método Nullable<T>.GetValueOrDefault() si el valor que se va usar cuando un valor de tipo que acepta valores NULL es null debe ser el valor predeterminado del tipo de valor subyacente.

  • A partir de C# 7.0, puede usar una expresión throw como el operando derecho del operador ?? para hacer el código de comprobación de argumentos más conciso:

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value), "Name cannot be null");
    }
    

    El ejemplo anterior también muestra cómo usar miembros con forma de expresión para definir una propiedad.

  • A partir de C# 8.0, puede usar el operador ??= para reemplazar el código del formulario

    if (variable is null)
    {
        variable = expression;
    }
    

    por el siguiente código:

    variable ??= expression;
    

Posibilidad de sobrecarga del operador

Los operadores ?? y ??= no se pueden sobrecargar.

especificación del lenguaje C#

Para obtener más información sobre el operador ??, vea la sección El operador de uso combinado de NULL de la especificación del lenguaje C#.

Para más información sobre el operador ??=, consulte la nota de propuesta de características.

Vea también