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


답변:


337

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

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

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

여기서 문제는

int? number = true ? 5 : null;

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

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

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


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.