문제

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로 홍보됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top