development

왜 int 변수 i가 아닌 short로 1을 전달할 수 있습니까?

big-blog 2020. 6. 14. 09:43
반응형

왜 int 변수 i가 아닌 short로 1을 전달할 수 있습니까?


첫 번째와 두 번째 쓰기는 왜 작동하지만 마지막은 작동하지 않습니까? 세 가지를 모두 허용하고 그것이 1, (int) 1인지 또는 내가 통과했는지 감지 할 수있는 방법이 있습니까? 그리고 실제로 왜 마지막이 허용됩니까? 두 번째는 허용되지만 마지막은 허용되지 않습니다.

컴파일 오류를 보여주는 데모

using System;
class Program
{
    public static void Write(short v) { }
    static void Main(string[] args)
    {
        Write(1);//ok
        Write((int)1);//ok
        int i=1;
        Write(i);//error!?
    }
}

처음 두 개는 상수 식이고 마지막 두 개는 그렇지 않습니다.

C # 사양에서는 상수에 대해서는 int에서 short로 암시 적으로 변환 할 수 있지만 다른 식에는 사용할 수 없습니다. 상수의 경우 컴파일러에서 값이 대상 유형에 맞는지 확인할 수 있지만 정규 표현식에는 적합하지 않으므로 합리적인 규칙입니다.

이 규칙은 암시 적 변환은 무손실이어야한다는 지침에 따릅니다.

6.1.8 암시 적 상수 표현식 변환

암시 적 상수 표현식 변환은 다음 변환을 허용합니다.

  • 일정한 표현 유형 (§7.18)의 int형식으로 변환 할 수 sbyte, byte, short, ushort, uint, 또는 ulong상기 제공된 값의 정수 표현은 대상 유형의 범위이다.
  • 일정한 표현 유형은 long유형으로 변환 할 수 ulong의 값을 제공하는, 일정한 표현이 음수 아니다.

(C # 언어 사양 버전 3.0에서 인용)


로부터 암시 적 변환이 없습니다 intshort인해 절단의 가능성은. 그러나 상수 표현식컴파일러에 의해 대상 유형으로 취급 될 수 있습니다 .

1? 문제가되지 않습니다 : 분명히 유효한 short값입니다. i? 그다지 많지 않습니다. short.MaxValue예를 들어 어떤 값일 수 있으며 컴파일러는 일반적인 경우이를 확인할 수 없습니다.


int 리터럴은 암시 적으로 변환 할 수 있습니다 short. 이므로:

당신은 암시 적으로 더 큰 저장 크기의 nonliteral 숫자 형식을 변환 할 수 없습니다 짧은

따라서 리터럴의 암시 적 변환이 허용되므로 처음 두 작업이 작동합니다.


첫 번째 두 가지 리터럴 / 상수를 전달했기 때문에 세 번째로 정수를 전달할 때 자동 유형 변환이 없기 때문입니다.

편집 : 누군가 나를 이길!


리터럴 유형은 더 큰 크기의 짧은 유형으로 암시 적으로 변환 되지 않기 때문입니다 .

암시 적 변환은 상수 표현에만 가능합니다.

public static void Write(short v) { }

당신이 integer인수로 가치를 전달할 short

int i=1;
Write(i);  //Which is Nonliteral here

컴파일러가 코드 실패 이유 알려줍니다 .

cannot convert `int' expression to type `short'

그래서 여기에 당신이 물어봐야 할 질문이 있습니다 : 왜이 ​​전환이 실패합니까? "c # convert int short"를 봤고 short키워드 에 대한 MS C # 페이지에서 끝났습니다 .

http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx

이 페이지에서 알 수 있듯이 더 큰 데이터 유형에서 내재 된 캐스트는 short리터럴에만 허용됩니다. 컴파일러는 리터럴이 범위를 벗어 났을 때 알 수 있지만 그렇지 않으면 알 수 없으므로 프로그램 논리에서 범위를 벗어난 오류를 피할 수 있다는 확신이 필요합니다. 그 확신은 캐스트에 의해 제공됩니다.

Write((short)i)

int-> short에서 변환하면 데이터가 잘릴 수 있습니다. 그 이유입니다.

참고 URL : https://stackoverflow.com/questions/11432508/why-can-i-pass-1-as-a-short-but-not-the-int-variable-i

반응형