???? 및 ??= 연산자(C# 참조)and ??= operators (C# reference)

null 병합 연산자 ??null이 아닌 경우 왼쪽 피연산자의 값을 반환합니다. 그렇지 않으면 오른쪽 피연자를 평가하고 그 결과를 반환합니다.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. 왼쪽 피연산자가 null이 아닌 것으로 평가되면 ?? 연산자는 오른쪽 피연산자를 평가하지 않습니다.The ?? operator doesn't evaluate its right-hand operand if the left-hand operand evaluates to non-null.

C# 8.0 이상에서 사용할 수 있는 null 병합 할당 연산자 ??=는 왼쪽 피연산자가 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. 왼쪽 피연산자가 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

??= 연산자의 왼쪽 피연산자는 변수, 속성 또는 인덱서 요소여야 합니다.The left-hand operand of the ??= operator must be a variable, a property, or an indexer element.

C# 7.3 이전 버전에서 ?? 연산자의 왼쪽 피연산자 형식은 참조 형식 또는 Nullable 값 형식이어야 합니다.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. C# 8.0부터 이 요구 사항이 다음과 같이 바뀝니다. ????= 연산자의 왼쪽 피연산자 형식은 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. 특히 C# 8.0부터 비제한 형식 매개 변수와 함께 null 병합 연산자를 사용할 수 있습니다.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);
}

null 병합 연산자는 오른쪽 결합입니다.The null-coalescing operators are right-associative. 즉, 양식의 식이That is, expressions of the form

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

다음과 같이 계산됩니다.are evaluated as

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

Examples

????= 연산자는 다음과 같은 시나리오에서 유용할 수 있습니다.The ?? and ??= operators can be useful in the following scenarios:

  • null 병합 연산자 ?. 및 ?[]가 있는 식에서 ?? 연산자를 사용하여 null 조건부 연산을 사용한 식의 결과가 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
    
  • nullable 값 형식을 사용하고 기본값 유형의 값을 제공해야 할 때 ?? 연산자를 사용하여 nullable 값이 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
    

    nullable 형식 값이 null일 때 사용될 값이 기본 값 형식의 기본 값이어야 하는 경우 Nullable<T>.GetValueOrDefault() 메서드를 사용합니다.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.

  • C# 7.0부터 ?? 연산자의 오른쪽 피연산자로 throw을 사용하여 인수 확인 코드를 보다 간결하게 만들 수 있습니다.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");
    }
    

    앞의 예제에서는 식 본문 멤버를 사용하여 속성을 정의하는 방법도 보여줍니다.The preceding example also demonstrates how to use expression-bodied members to define a property.

  • C# 8.0부터 ??= 연산자를 사용하여 다음 양식의 코드를Beginning with C# 8.0, you can use the ??= operator to replace the code of the form

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

    다음 코드와 바꿉니다.with the following code:

    variable ??= expression;
    

연산자 오버로드 가능성Operator overloadability

????= 연산자는 오버로드할 수 없습니다.The operators ?? and ??= cannot be overloaded.

C# 언어 사양C# language specification

?? 연산자에 대한 자세한 내용은 C# 언어 사양null 병합 연산자 섹션을 참조하세요.For more information about the ?? operator, see The null coalescing operator section of the C# language specification.

??= 연산자에 대한 자세한 내용은 기능 제안 노트를 참조하세요.For more information about the ??= operator, see the feature proposal note.

참고 항목See also