[C#] 왜 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”를 googled하고 MS C # 페이지에서short 키워드 .

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

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

Write((short)i)


답변

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