2010-01-13 2 views
8

:짧은 단락 마이너스가 int가됩니까? 다음에서

public class p 
{ 
    short? mID; 
    short? dID; 
} 

short id = p.mID ?? -p.dID.Value; 

컴파일러는 나에게 오류가 있습니다 : 그것은으로의

short id = p.mID ?? (short)-p.dID.Value; 

을 : 나는 그것이 작동하려면 다음에 코드를 변경해야

Error 21 Cannot implicitly convert type 'int' to 'short'. An explicit conversion exists (are you missing a cast?)

을 컴파일러에서 (int) 0 - p.dID.Value와 같은 작업을 수행 중이거나 Int16.operator가 Int32s를 반환하는 경우 ...?

답변

13

나는 상태 사양의 섹션 7.6.2을 참조 : 양식 -x의 작동을 위해


는, 단항 연산자의 오버로드 확인이 특정 연산자 구현을 선택하기 위해 적용된다. 피연산자는 선택된 연산자의 매개 변수 유형으로 변환되며 결과의 유형은 연산자의 반환 유형입니다. 미리 정의 된 연산자 부정은 :

정수 부정 :

int operator –(int x); 
long operator –(long x); 

결과가 제로로부터 x를 감산함으로써 계산된다. x의 값이 피연산자 유형의 가장 작은 표현 가능 값 (int의 경우 -2^31 또는 long의 경우 -2^63) 인 경우 x의 수학적 부정은 피연산자 유형 내에서 표현할 수 없습니다. 체크 된 컨텍스트 내에서 발생하면 System.OverflowException이 throw됩니다. 검사되지 않은 컨텍스트 내에서 발생하면 결과는 피연산자의 값이며 오버플로는보고되지 않습니다. 부정 연산자의 피연산자가 uint 유형 인 경우 long 유형으로 변환되며 결과 유형은 long입니다. 예외는 int 값 -2147483648 (-2^31)이 10 진 정수 리터럴로 쓰여지도록 허용하는 규칙입니다.

부정 연산자의 피연산자가 ulong 유형 인 경우 컴파일 타임 오류가 발생합니다. 예외는 long 값 -9223372036854775808 (-2^63)이 10 진수 리터럴로 쓰여지도록 허용하는 규칙입니다.

부동 소수점 부정 : 그 부호가 반전하여

float operator –(float x); 
double operator –(double x); 

결과 x의 값이다. x가 NaN의 경우, 결과도 NaN가됩니다.

소수점 부정 :

decimal operator –(decimal x); 

결과는 제로로부터 x를 감산함으로써 계산된다. 십진수 부정은 System.Decimal 유형의 단항 빼기 연산자를 사용하는 것과 같습니다.


보시다시피 단락에는 단항 마이너스 연산자가 정의되어 있지 않습니다. 과부하 해결은 사용 가능한 모든 단항 마이너스 연산자와 가장 일치하기 때문에 정수를 사용합니다.

+1

위대한 답변; 감사! 하지만 왜 단락에 정의 된 단항 마이너스 연산자가 없는지 궁금합니다. 어떤 이론? – rabidpebble

+0

@rabidpebble 이것은 (물론?) 바이너리 연산자에 대해서도 동일합니다. 예를 들어,'p.mID + p.mID','p.mID/p.mID','p.mID & p.mID' 등 많은 피연산자들이 모두'short's 인 경우에도 모두'int' 타입을 갖습니다 . –

2

짧은 값을 취하는 단항 마이너스 연산자는 없습니다. 대신, 과부하 해결은 단항 마이너스 연산자의 int 버전을 선택하고 암시 적 변환을 수행합니다.