답변:
사양 (§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 : 여기에서 일반적인 혼란의 원인 인 조건식의 유형을 결정할 때 왼쪽 유형이 무시된다는 점에 유의하십시오.
new int?()
대신에 다른 옵션이 (int?)null
있습니다.
DateTime
실제로 필요할 때 데이터를 캐스트하려는 경우에도 마찬가지입니다.(DateTime?)
null
식별 가능한 유형이 없습니다-행복하게하기 위해 약간의 proding이 필요합니다.
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;
과 int? number = true ? (int?)5 : null;
둘 다입니다 !! 스크래치, 스크래치
다른 언급으로, 5는이다 int
, 그리고 null
암시 적으로 변환 할 수 없습니다 int
.
이 문제를 해결하는 다른 방법은 다음과 같습니다.
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
또한 어디에서나 볼 int?
수 있습니다 Nullable<int>
.
년 C# 9
이 이제 허용 블로그
입력 한 대상 ?? 그리고?
때로는 조건부 ?? 및? : 표현식은 분기간에 명백한 공유 유형을 갖지 않습니다. 이러한 경우는 오늘 실패하지만 두 분기로 변환 할 대상 유형이있는 경우 C # 9.0에서 허용합니다.
Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type
또는 당신의 예 :
// Allowed in C# 9.
int? number = true ? 5 : null;