Compartir a través de


?? operadores y ??= : los operadores de fusión null

El operador ?? de fusión null devuelve el valor de su operando izquierdo si no nulles . De lo contrario, evalúa el operando de la derecha y devuelve su resultado. El operador ?? no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL. El operador de asignación de fusión de NULL ??= asigna el valor del operando de la derecha a su operando de la izquierda solo si este último se evalúa como null. El operador ??= no evalúa su operando de la derecha si el operando de la izquierda se evalúa como no NULL.

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

Console.WriteLine((numbers is null)); // expected: true
// if numbers is null, initialize it. Then, add 5 to numbers
(numbers ??= new List<int>()).Add(5);
Console.WriteLine(string.Join(" ", numbers));  // output: 5
Console.WriteLine((numbers is null)); // expected: false        


Console.WriteLine((a is null)); // expected: true
Console.WriteLine((a ?? 3)); // expected: 3 since a is still null 
// if a is null then assign 0 to a and add a to the list
numbers.Add(a ??= 0);
Console.WriteLine((a is null)); // expected: false        
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 indexador .

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

El tipo del operando izquierdo de los operadores ?? y ??= no puede ser un tipo de valor no anulable. En concreto, 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, expresiones del formulario

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

se evalúan como

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

Ejemplos

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

  • En expresiones que usan los operadores ?. condicionales NULL y ?[], use el ?? operador para proporcionar una expresión alternativa para evaluar si el resultado de la expresión con operaciones condicionales NULL es 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 trabaje con tipos de valor que aceptan valores NULL y necesite proporcionar un valor de un tipo de valor subyacente, use el ?? operador para especificar el valor que se debe proporcionar si un valor de tipo que acepta valores NULL es :null

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

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

  • Para que el código de comprobación de argumentos sea más conciso, use una throw expresión como operando derecho del ?? operador:

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

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

  • Use el operador para reemplazar el ??= código del siguiente formulario:

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

    Use el código siguiente:

    variable ??= expression;
    

Sobrecarga del operador

No se pueden sobrecargar los ?? operadores y ??= .

Especificación del lenguaje C#

Para obtener más información sobre el ?? operador, vea la sección Operador de fusión null de la especificación del lenguaje C#.

Para obtener más información sobre el ??= operador, consulte la sección Asignación compuesta de la especificación del lenguaje C#.

Consulte también