널 입력 가능 유형 및 삼항 연산자 : 왜`? 10 : 널 금지? [복제]
이 질문에는 이미 답변이 있습니다.
- Nullable <value> 유형의 조건부 연산자 할당? 답변 5 개
- 이 C # 코드는 왜 컴파일되지 않습니까? 답변 4 개
방금 이상한 오류가 발생했습니다.
private bool GetBoolValue()
{
//Do some logic and return true or false
}
그런 다음 다른 방법으로 다음과 같이하십시오.
int? x = GetBoolValue() ? 10 : null;
이 메서드가 true를 반환하면 간단하게 Nullable int
x에 10을 할당합니다 . 그렇지 않으면 널 입력 가능 정수에 널을 지정하십시오 . 그러나 컴파일러는 다음과 같이 불평합니다.
오류 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;
기본적으로 일어나는 일은 조건부 연산자가 표현식의 "반환 유형"을 결정할 수 없다는 것입니다. 컴파일러 implictitly 그 결정 이후 10
이고 int
그 다음이 식의 리턴 타입이 될 것으로 판단한다 int
뿐만. 이 때문에 int
수 없다 null
(조건 연산자의 세 번째 피연산자)는 불평한다.
에 a를 캐스트함으로써 우리는 컴파일러에게이 표현식의 리턴 타입이 null
a Nullable<int>
라고 명시 적으로 알립니다 Nullable<int>
. 당신도 쉽게 캐스팅 할 10
수 int?
있었고 같은 효과를 낼 수있었습니다.
이 시도:
int? result = condition ? 10 : default(int?);
부수적으로, C # 컴파일러의 Microsoft 구현은 실제로 조건 연산자의 유형 분석을 매우 미묘하고 흥미로운 (나에게) 잘못받습니다. 그것에 관한 나의 기사는 Type 추론 화, Part 1 입니다.
다음 중 하나를 시도하십시오.
int? x = GetBoolValue() ? (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;
문제는 삼항 연산자가 첫 번째 매개 변수 할당을 기반으로 유형을 유추한다는 것입니다.이 경우 10은 nullable int가 아닌 int입니다.
당신은 더 나은 행운을 가질 수 있습니다 :
int? x = GetBoolValue() (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;
이것이 보이는 이유는 Nullable을 사용하는 장면 뒤에서 "null"이 Nullable의 null 인스턴스라는 것을 C #에 알려 주어야하기 때문입니다.
Explict 캐스트를 추가하십시오.
int? x = GetBoolValue() ? 10 : (int?)null;
혼동되는 것은 삼항 연산자입니다. 두 번째 인수는 정수이므로 세 번째 인수도 정수로 간주되며 null이 맞지 않습니다.
컴파일러는 결과를 할당하는 것이 아니라 두 번째 및 세 번째 피연산자로 조건부 연산자의 유형을 결정하기 때문입니다. 컴파일러가 형식을 결정하는 데 사용할 수있는 정수와 null 참조 사이에는 직접적인 캐스트가 없습니다.
'IT story' 카테고리의 다른 글
iTerm2 프로파일을 내보내는 방법 (0) | 2020.04.09 |
---|---|
UnicodeDecodeError : 'utf8'코덱이 바이트 0x9c를 디코딩 할 수 없습니다 (0) | 2020.04.09 |
이전 버전의 Hibernate (~ 2009)를 사용하여 행을 어떻게 계산합니까? (0) | 2020.04.09 |
dict를 사용하여 팬더 열의 값을 다시 매핑하십시오. (0) | 2020.04.09 |
Eclipse는 일치하는 변수를 강조 표시하지 않습니다 (0) | 2020.04.09 |