왜 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에서 인용)
로부터 암시 적 변환이 없습니다 int
로 short
인해 절단의 가능성은. 그러나 상수 표현식 은 컴파일러에 의해 대상 유형으로 취급 될 수 있습니다 .
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
'development' 카테고리의 다른 글
log4j에 stacktrace를 보내는 방법은 무엇입니까? (0) | 2020.06.14 |
---|---|
옵저버 블에서 자동으로 트리거하지 않고 뷰 새로 고침을 수행하는 방법은 무엇입니까? (0) | 2020.06.14 |
캐스퍼 즈 / 팬텀 제이스 vs 셀레늄 (0) | 2020.06.14 |
AngularJS : 디자인 패턴 이해 (0) | 2020.06.14 |
SQL 쿼리를 사용하여 문자열을 int로 변환 (0) | 2020.06.14 |