int-> 3 대정 성명서에서 짧은 전환 없음
-
16-09-2019 - |
문제
short s;
s = (EitherTrueOrFalse()) ? 0 : 1;
이것은 다음과 같이 실패합니다.
오류 CS0266 : 유형 'int'를 'short'로 암시 적으로 변환 할 수 없습니다. 명백한 전환이 존재합니다 (캐스트가 놓치고 있습니까?)
누구든지 이것이 왜 그런지 설명 할 수 있습니까? 내가 생각할 수있는 유일한 것은 컴파일러가 두 번째 값을 보지 않고 두 가지 사이의 범위를 모른다는 것입니다.
short s;
s = (EitherTrueOrFalse()) ? 0 : 65000;
옳은? 유일한 수정 사항은 못생긴 캐스트인가?
또한 C#에는 짧은 유형의 유형 접미사가없는 것 같습니다. 그것은 꽤 중대한 감독 IMO입니다. 그렇지 않으면, 그것은 해결책이었을 것입니다 ...
해결책
컴파일러는 a에서 암시 적 변환을 갖습니다 끊임없는 다양한 원시 유형에 대한 표현 (값이 적절한 범위 내에있는 한)이지만 여기서는 표현이 일정하지 않으며 int 표현 일뿐입니다. 그것은 거의 동일합니다.
short s;
s = CallSomeMethodReturningInt32();
컴파일러에 관한 한.
두 가지 옵션이 있습니다. 전체 표현식을 캐스트하거나 후자의 두 피연산자 각각을 캐스트 할 수 있습니다.
short s = (EitherTrueOrFalse()) ? (short) 0 : (short) 1;
전체 발현 유형을 만들려면 short
. 이 특별한 경우, 명시 적으로 선언 할 수있는 숫자 문자 접미사가없는 것은 동정입니다 short
정확한. 분명히 언어 디자이너들은 이것을 고려했지만 비교적 드문 상황이라고 생각했습니다. (아마 동의 할 것 같아요.)
암시 적 상수 변환에 대한 부분은 C# 3.0 사양 섹션 6.1.8에서 나온 것입니다.
6.1.8 암시 적 상수 표현 전환
암시 적 상수 표현식 변환은 다음과 같은 변환을 허용합니다.
- ㅏ 일정한 표현 (§7.18) 유형
int
SBYTE 형으로 변환 할 수 있습니다.byte
,short
,ushort
,uint
, 또는ulong
, 값을 제공했습니다 일정한 표현 대상 유형의 범위 내에 있습니다.- ㅏ 일정한 표현 유형의
long
유형으로 변환 할 수 있습니다ulong
, 값을 제공했습니다 일정한 표현부정적이지 않습니다.
다른 팁
때문에 캐스트는 컴파일러에 의해 수행됩니다, 런타임이 아니라, 나는 그것을 못생긴 캐스트라고 부르지 않을 것입니다. 나는 그것을 복잡한 구문이라고 부를 것입니다.
s = (EitherTrueOrFalse()) ? (short)0 : (short)1;
내 말은, 이것은 추악 해 보이더라도 C#로 작성된 방식입니다.
이것 좀 봐 블로그 기사. 보다 마크 그라벨의 대답 그 질문에.
나는 이것이 컴파일하지 않는 것과 같은 이유가 있다고 생각합니다.
short s1 = GetShort1();
short s2 = GetShort2();
short s3 = s1 + s2;
즉, 짧은 것이 무언가에 사용될 때마다 int로 홍보됩니다.