다음을 통해 공유


Null 병합 할당

메모

이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.

기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는 언어 디자인 모임 (LDM) 관련노트에 기록되어 있습니다.

사양문서에서 기능 사양서를 C# 언어 표준에 채택하는 과정에 대해 상세히 알아볼 수 있습니다.

요약

변수가 null인 경우 값이 할당되는 일반적인 코딩 패턴을 간소화합니다.

이 제안의 일환으로 형식이 제약이 없는 형식 매개 변수인 식을 왼쪽에서 사용할 수 있도록 ?? 형식 요구 사항을 완화합니다.

동기

형태의 코드를 흔히 볼 수 있습니다.

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

이 제안은 이 함수를 수행하는 언어에 오버로드할 수 없는 이진 연산자를 추가합니다.

이 기능에 대한 8개 이상의 개별 커뮤니티 요청이 있었습니다.

상세 디자인

새로운 형식의 대입 연산자를 추가합니다.

assignment_operator
    : '??='
    ;

이는 복합 할당 연산자(§12.21.4)에 대한 기존 의미 체계 규칙을 따릅니다. 단, 왼쪽이 null이 아닌 경우 할당을 무시합니다. 이 기능에 대한 규칙은 다음과 같습니다.

a ??= b가 주어졌을 때, Aa의 형식이고, Bb의 형식이며, A이 nullable 값 형식인 경우 A의 기본 형식은 A0입니다.

  1. A 없거나 null을 허용하지 않는 값 형식이면 컴파일 시간 오류가 발생합니다.
  2. B이 암시적으로 A로 또는 A0로 변환될 수 없고, A0이 있는 경우, 컴파일 시간 오류가 발생합니다.
  3. A0가 존재하고 B이 암시적으로 A0로 변환될 수 있으며 B이 동적이 아닌 경우 a ??= b의 유형은 A0입니다. a ??= b 런타임에 다음과 같이 평가됩니다.
    var tmp = a.GetValueOrDefault();
    if (!a.HasValue) { tmp = b; a = tmp; }
    tmp
    
    단, a 한 번만 평가됩니다.
  4. 그렇지 않으면, a ??= b의 유형은 A입니다. a ??= b은 런타임에 a ?? (a = b)과 동일하게 평가되며, 단 a는 한 번만 평가됩니다.

??형식 요구 사항의 완화를 위해, Aa의 형식인 경우 현재 명시된 사양을 업데이트합니다: a ?? b.

  1. A가 있고 nullable 형식 또는 참조 형식이 아닌 경우 컴파일 시간 오류가 발생합니다.

다음을 위해 이 요구 사항을 완화합니다.

  1. A가 있고 nullable이 아닌 값 형식인 경우 컴파일 시간 오류가 발생합니다.

이렇게 하면 제약이 없는 형식 매개 변수 T가 존재하며, 그 형식이 null 허용 형식도 아니고 참조 형식도 아니기 때문에 null 병합 연산자가 이러한 제한되지 않은 형식 매개 변수에서 작동할 수 있습니다.

단점

모든 언어 기능과 마찬가지로, 이 기능의 이점을 누릴 수 있는 C# 프로그램 본문에 제공되는 추가 명확성으로 언어에 대한 추가 복잡성이 상환되는지 의문을 제기해야 합니다.

대안

프로그래머가 직접 (x = x ?? y), if (x == null) x = y;또는 x ?? (x = y) 작성할 수 있습니다.

해결되지 않은 질문

  • [ ] &&=||= 연산자도 지원해야 하나요?

디자인 회의

없음.