Null 병합 할당
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는 언어 디자인 모임 (LDM) 관련노트에 기록되어 있습니다.
사양문서에서 기능 사양서를 C# 언어 표준에 채택하는 과정에 대해 상세히 알아볼 수 있습니다.
요약
변수가 null인 경우 값이 할당되는 일반적인 코딩 패턴을 간소화합니다.
이 제안의 일환으로 형식이 제약이 없는 형식 매개 변수인 식을 왼쪽에서 사용할 수 있도록 ??
형식 요구 사항을 완화합니다.
동기
형태의 코드를 흔히 볼 수 있습니다.
if (variable == null)
{
variable = expression;
}
이 제안은 이 함수를 수행하는 언어에 오버로드할 수 없는 이진 연산자를 추가합니다.
이 기능에 대한 8개 이상의 개별 커뮤니티 요청이 있었습니다.
상세 디자인
새로운 형식의 대입 연산자를 추가합니다.
assignment_operator
: '??='
;
이는 복합 할당 연산자(§12.21.4)에 대한 기존 의미 체계 규칙을 따릅니다. 단, 왼쪽이 null이 아닌 경우 할당을 무시합니다. 이 기능에 대한 규칙은 다음과 같습니다.
a ??= b
가 주어졌을 때, A
은 a
의 형식이고, B
은 b
의 형식이며, A
이 nullable 값 형식인 경우 A
의 기본 형식은 A0
입니다.
-
A
없거나 null을 허용하지 않는 값 형식이면 컴파일 시간 오류가 발생합니다. -
B
이 암시적으로A
로 또는A0
로 변환될 수 없고,A0
이 있는 경우, 컴파일 시간 오류가 발생합니다. -
A0
가 존재하고B
이 암시적으로A0
로 변환될 수 있으며B
이 동적이 아닌 경우a ??= b
의 유형은A0
입니다.a ??= b
런타임에 다음과 같이 평가됩니다.
단,var tmp = a.GetValueOrDefault(); if (!a.HasValue) { tmp = b; a = tmp; } tmp
a
한 번만 평가됩니다. - 그렇지 않으면,
a ??= b
의 유형은A
입니다.a ??= b
은 런타임에a ?? (a = b)
과 동일하게 평가되며, 단a
는 한 번만 평가됩니다.
??
형식 요구 사항의 완화를 위해, A
가 a
의 형식인 경우 현재 명시된 사양을 업데이트합니다: a ?? b
.
- A가 있고 nullable 형식 또는 참조 형식이 아닌 경우 컴파일 시간 오류가 발생합니다.
다음을 위해 이 요구 사항을 완화합니다.
- A가 있고 nullable이 아닌 값 형식인 경우 컴파일 시간 오류가 발생합니다.
이렇게 하면 제약이 없는 형식 매개 변수 T
가 존재하며, 그 형식이 null 허용 형식도 아니고 참조 형식도 아니기 때문에 null 병합 연산자가 이러한 제한되지 않은 형식 매개 변수에서 작동할 수 있습니다.
단점
모든 언어 기능과 마찬가지로, 이 기능의 이점을 누릴 수 있는 C# 프로그램 본문에 제공되는 추가 명확성으로 언어에 대한 추가 복잡성이 상환되는지 의문을 제기해야 합니다.
대안
프로그래머가 직접 (x = x ?? y)
, if (x == null) x = y;
또는 x ?? (x = y)
작성할 수 있습니다.
해결되지 않은 질문
- [ ]
&&=
및||=
연산자도 지원해야 하나요?
디자인 회의
없음.
C# feature specifications