null 가능한 유형 및 3진수 연산자: '? 10: null'이 금지된 이유는 무엇입니까?
방금 이상한 오류를 발견했습니다.
private bool GetBoolValue()
{
//Do some logic and return true or false
}
다른 방법으로 다음과 같은 것을 들 수 있습니다.
int? x = GetBoolValue() ? 10 : null;
단순, 메서드가 true를 반환하면 Nullable에 10을 할당합니다.int
그렇지 않으면 null을 null 가능한 int에 할당합니다.그러나 컴파일러는 다음과 같이 불평합니다.
오류 1 사이에 암시적 변환이 없으므로 조건식 유형을 확인할 수 없습니다.
int
그리고.<null>
.
제가 미쳐가나요?
컴파일러는 먼저 오른쪽 표현식을 평가하려고 합니다.
GetBoolValue() ? 10 : null
그10
이다.int
문자 그대로의int?
) 및null
그건, 음,null
이 둘 사이에는 암묵적인 변환이 없으므로 오류 메시지가 표시됩니다.
오른쪽 식을 다음 중 하나로 변경하면 다음 사이에 암묵적인 변환이 있기 때문에 컴파일됩니다.int?
그리고.null
(#1) 및 사이int
그리고.int?
(#2, #3).
GetBoolValue() ? (int?)10 : null // #1
GetBoolValue() ? 10 : (int?)null // #2
GetBoolValue() ? 10 : default(int?) // #3
사용해 보십시오.
int? x = GetBoolValue() ? 10 : (int?)null;
기본적으로 조건부 연산자는 식의 "반환 유형"을 결정할 수 없습니다.컴파일러가 암묵적으로 결정하기 때문에10
이다.int
그런 다음 이 표현식의 반환 유형은 다음과 같아야 한다고 결정합니다.int
뿐만 아니라.그 이후로int
있을 수 없는null
(조건부 연산자의 세 번째 피연산자) 그것은 불평합니다.
캐스팅을 통해null
아주Nullable<int>
우리는 컴파일러에게 이 표현식의 반환 유형이 다음과 같아야 한다고 명시적으로 말하고 있습니다.Nullable<int>
당신은 쉽게 캐스팅할 수 있었습니다.10
로.int?
또한 동일한 효과를 보였습니다.
사용해 보십시오.
int? result = condition ? 10 : default(int?);
덧붙여서, C# 컴파일러의 Microsoft 구현은 실제로 조건 연산자의 유형 분석을 매우 미묘하고 흥미로운 방식으로 잘못 이해합니다.그것에 대한 제 기사는 유형 추론 문제, 1부(2006-05-24)입니다.
다음 중 하나를 사용해 보십시오.
int? x = GetBoolValue() ? (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;
문제는 3차 연산자가 첫 번째 매개 변수 할당을 기반으로 유형을 추론하고 있다는 것입니다.이 경우 10, 이것은 nullable int가 아닌 int입니다.
다음과 같은 이점이 있습니다.
int? x = GetBoolValue() (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;
이것이 표시되는 이유는 Nullable을 사용하는 장면 뒤에서 C#에게 "null"이 Nullable의 Null 인스턴스임을 알려야 하기 때문입니다.
명쾌한 출연진을 추가하면 됩니다.
int? x = GetBoolValue() ? 10 : (int?)null;
혼동되는 것은 3차 연산자입니다. 두 번째 인수는 정수이고 세 번째 인수도 정수로 예상되며 null은 적합하지 않습니다.
컴파일러가 결과를 할당하는 것이 아니라 두 번째와 세 번째 피연산자로 조건부 연산자의 유형을 결정하기 때문입니다.정수와 null 참조 사이에는 컴파일러가 유형을 결정하는 데 사용할 수 있는 직접 캐스트가 없습니다.
언급URL : https://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden
'programing' 카테고리의 다른 글
확장이 있지만 uuid_generate_v4가 실패함 (0) | 2023.05.27 |
---|---|
WPF 제목 표시줄 배경색 변경 (0) | 2023.05.27 |
C++에서 배열의 모든 요소를 하나의 기본값으로 초기화하시겠습니까? (0) | 2023.05.22 |
SessionState와 ViewState의 차이점은 무엇입니까? (0) | 2023.05.22 |
macOS Catalina 10.15(베타) - ~/.bash_profile이 내 셸에서 소스되지 않는 이유는 무엇입니까? (0) | 2023.05.22 |