'int'와 'int'사이에 암시 적 변환이 없으므로 조건식의 유형을 확인할 수 없습니다.
왜 컴파일되지 않습니까?
int? number = true ? 5 : null;
'int'와 <null> 사이에 암시 적 변환이 없으므로 조건식 유형을 확인할 수 없습니다.
사양 (§7.14)의 조건식을 위해 말한다 b ? x : y
, 세 가지 가능성이 있습니다, 하나 x
와 y
모두 유형이 와 특정 좋은 조건 의 하나를 충족 x
하고 y
유형을 가지고 및 특정 좋은 조건이 컴파일 타임 오류가 충족, 또는 발생합니다. 여기서 "확실한 양호한 조건"은 특정 변환이 가능하다는 것을 의미하며, 아래에서 자세히 설명합니다.
이제 스펙의 독일 부분을 보자.
단지 중 하나가
x
및y
유형을 가지고 있으며, 모두x
하고y
, 암시 적 유형으로 변환되어 다음 조건식의 유형입니다.
여기서 문제는
int? number = true ? 5 : null;
조건부 결과 중 하나만 유형이 있습니다. 여기 x
입니다 int
문자, 그리고 y
이다 null
않는 없는 유형을 가지고 및 null
암시 적으로 변환되지 않습니다 int
1 . 따라서 "확실한 양호한 조건"이 충족되지 않고 컴파일 타임 오류가 발생합니다.
이 문제 에는 두 가지 방법이 있습니다.
int? number = true ? (int?)5 : null;
여기에서 우리는 단지 한 경우에 여전히 x
및 y
유형을 가지고있다. 참고 것을 null
여전히 유형이 없습니다 아직 컴파일러는이 때문에 어떤 문제가되지 않습니다 (int?)5
및 null
모두에 암시 적으로 변환됩니다 int?
(§6.1.4 및 §6.1.5).
다른 방법은 분명히 :
int? number = true ? 5 : (int?)null;
그러나 이제 이것이 왜 좋은지 이해하기 위해 사양에서 다른 절 을 읽어야합니다 .
경우
x
유형이X
와y
유형이Y
다음
암시 적 변환 (§6.1가)에서 존재하는 경우
X
에Y
에서가 아니라Y
에X
, 다음Y
조건식의 유형입니다.암시 적 변환 (§6.1가)에서 존재하는 경우
Y
에X
에서가 아니라X
에Y
, 다음X
조건식의 유형입니다.그렇지 않으면 식 유형을 확인할 수 없으며 컴파일 타임 오류가 발생합니다.
여기는 x
유형 int
이며 y
유형 int?
입니다. 에서 int?
로의 암시 적 변환은 없지만 식에서 int
로의 암시 적 변환 int
이 int?
있으므로 식의 유형은입니다 int?
.
1 : 여기에서 일반적인 혼란의 원천 인 조건식의 유형을 결정할 때 왼쪽 유형이 무시된다는 점에 유의하십시오.
null
식별 가능한 유형이 없습니다. 행복하게하려면 약간의 proding이 필요합니다.
int? number = true ? 5 : (int?)null;
'IT story' 카테고리의 다른 글
공동 디자인을 사용하여 OSX 앱에 서명하려고하는“사용자 상호 작용이 허용되지 않습니다” (0) | 2020.06.22 |
---|---|
유형을 삭제하지 않고 색인 / 유형에서 모든 문서 삭제 (0) | 2020.06.22 |
사용자 정의 리터럴은 C ++에 어떤 새로운 기능을 추가합니까? (0) | 2020.06.22 |
안드로이드 스튜디오에서 APK에 .so 라이브러리 포함 (0) | 2020.06.22 |
C #에서 문자열에서 함수 호출 (0) | 2020.06.22 |