IT story

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

hot-time 2020. 6. 22. 07:38
반응형

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


왜 컴파일되지 않습니까?

int? number = true ? 5 : null;

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


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


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

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

참고 : https://stackoverflow.com/questions/18260528/type-of-conditional-expression-cannot-be-determined-because-there-is-no-implicit

반응형