???? Operadores ?? y ?? (referencia de C#)and ??= operators (C# reference)

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.The null-coalescing operator ?? returns the value of its left-hand operand if it isn't null; otherwise, it evaluates the right-hand operand and returns its result. El operador ?? no evalúa su operando derecho si el operando izquierdo se evalúa como no NULL.The ?? operator doesn't evaluate its right-hand operand if the left-hand operand evaluates to non-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.Available in C# 8.0 and later, the null-coalescing assignment operator ??= assigns the value of its right-hand operand to its left-hand operand only if the left-hand operand evaluates to null. El operador ??= no evalúa su operando derecho si el operando izquierdo se evalúa como no NULL.The ??= operator doesn't evaluate its right-hand operand if the left-hand operand evaluates to non-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.The left-hand operand of the ??= operator must be a variable, a property, or an indexer element.

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.In C# 7.3 and earlier, the type of the left-hand operand of the ?? operator must be either a reference type or a nullable value type. 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.Beginning with C# 8.0, that requirement is replaced with the following: the type of the left-hand operand of the ?? and ??= operators cannot be a non-nullable value type. En concreto, a partir de C# 8.0 puede usar los operadores de fusión de NULL con parámetros de tipo sin restricciones:In particular, beginning with C# 8.0, you can use the null-coalescing operators with unconstrained type parameters:

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.The null-coalescing operators are right-associative. Es decir, las expresiones del formularioThat is, expressions of the form

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

se evalúan comoare evaluated as

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

EjemplosExamples

Los operadores ?? y ??= puede resultar útiles en los siguientes escenarios:The ?? and ??= operators can be useful in the following scenarios:

  • 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:In expressions with the null-conditional operators ?. and ?[], you can use the ?? operator to provide an alternative expression to evaluate in case the result of the expression with null-conditional operations is 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:When you work with nullable value types and need to provide a value of an underlying value type, use the ?? operator to specify the value to provide in case a nullable type value is 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.Use the Nullable<T>.GetValueOrDefault() method if the value to be used when a nullable type value is null should be the default value of the underlying value type.

  • 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:Beginning with C# 7.0, you can use a throw expression as the right-hand operand of the ?? operator to make the argument-checking code more concise:

    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.The preceding example also demonstrates how to use expression-bodied members to define a property.

  • A partir de C# 8.0, puede usar el operador ??= para reemplazar el código del formularioBeginning with C# 8.0, you can use the ??= operator to replace the code of the form

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

    por el siguiente código:with the following code:

    variable ??= expression;
    

Posibilidad de sobrecarga del operadorOperator overloadability

Los operadores ?? y ??= no se pueden sobrecargar.The operators ?? and ??= cannot be overloaded.

especificación del lenguaje C#C# language specification

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#.For more information about the ?? operator, see The null coalescing operator section of the C# language specification.

Para más información sobre el operador ??=, consulte la nota de propuesta de características.For more information about the ??= operator, see the feature proposal note.

Vea tambiénSee also