'int'와 <null> 사이에 암시 적 변환이 없으므로 조건식 유형을 확인할 수 없습니다.


답변:


337

사양 (§7.14)의 조건식을 위해 말한다 b ? x : y, 세 가지 가능성이 있습니다, 하나 xy모두 유형이 특정 좋은 조건 의 하나를 충족 x하고 y유형을 가지고 특정 좋은 조건이 컴파일 타임 오류가 충족, 또는 발생합니다. 여기서 "확실한 양호한 조건"은 특정 변환이 가능하다는 것을 의미하며, 아래에서 자세히 설명합니다.

이제 스펙의 독일 부분을 보자.

하나만 xy유형을 가지고 있으며, 모두 x하고 y, 암시 적 유형으로 변환되어 다음 조건식의 유형입니다.

여기서 문제는

int? number = true ? 5 : null;

조건부 결과 중 하나만 유형이 있습니다. 여기 x입니다 int문자, 그리고 y이다 null않는 없는 유형을 가지고 null 암시 적으로 변환되지 않습니다 int1 . 따라서 "확실한 양호한 조건"이 충족되지 않고 컴파일 타임 오류가 발생합니다.

그곳에 에는 두 가지 방법이 있습니다.

int? number = true ? (int?)5 : null;

여기에서 우리는 단지 한 경우에 여전히 xy유형을 가지고있다. 그 참고 null 여전히 유형이 없습니다 아직 컴파일러는이 때문에 어떤 문제가되지 않습니다 (int?)5null모두에 암시 적으로 변환됩니다 int?(§6.1.4 및 §6.1.5).

다른 방법은 분명히 :

int? number = true ? 5 : (int?)null;

그러나 지금 우리는 이것이 왜 좋은지 이해하기 위해 사양에서 다른 절 .

x유형이있는 경우Xy유형이 Y다음

  • 암시 적 변환 (§6.1가)에서 존재하는 경우 XY, 그러나에서YX, 다음 Y조건식의 유형입니다.

  • 암시 적 변환 (§6.1가)에서 존재하는 경우 YX, 그러나에서XY, 다음 X조건식의 유형입니다.

  • 그렇지 않으면 식 유형을 확인할 수 없으며 컴파일 타임 오류가 발생합니다.

여기는 x유형 int이며 y유형 int?입니다. 에서 (으) int?로의 암시 적 변환이 없습니다int 식에서 로의 암시 적 변환 intint?있으므로 식의 유형은입니다 int?.

1 : 여기에서 일반적인 혼란의 원인 인 조건식의 유형을 결정할 때 왼쪽 유형이 무시된다는 점에 유의하십시오.


4
왜 이런 일이 발생했는지 설명하기 위해 스펙을 인용하면 좋습니다-+1!
JerKimball

7
new int?()대신에 다른 옵션이 (int?)null있습니다.
Guvante

1
널 입력 가능 데이터베이스 필드 유형 (예 : 널 입력 가능 DateTime)이 있고 DateTime실제로 필요할 때 데이터를 캐스트하려는 경우에도 마찬가지입니다.(DateTime?)
Mike Upjohn

73

null 식별 가능한 유형이 없습니다-행복하게하기 위해 약간의 proding이 필요합니다.

int? number = true ? 5 : (int?)null;

2
또는 가능합니다int? number = true ? 5 : null as int?;
Brad M

요점을 잘 아는 좋은 답변. 좋은 관련 독서 : ericlippert.com/2013/05/30/what-the-meaning-is-is-is
Benjamin Gruenbaum

문제는 없는 것을 null식별 가능한 유형이 없습니다. 문제는에서 (으) null로의 암시 적 변환이 없다는 것입니다 int. 자세한 내용은 여기를 참조하십시오 .
Jason

흥미로운 점은 컴파일 int? number = true ? 5 : (int?)null;int? number = true ? (int?)5 : null;둘 다입니다 !! 스크래치, 스크래치
davidhq

2
나는 이것이 왜 내 대답 에서 일어나는지 정확히 다룹니다 .
Jason Jason

4

다른 언급으로, 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>.


1

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.