2008-10-20 3 views
29

내가 암시 적 캐스트에 실패하는 이유에 호기심 오전 nullable 형식에는 할 수는 조건 연산자는 암시 적으로 ...

int? someValue = SomeCondition ? ResultOfSomeCalc() : null; 

캐스팅 내가 왜 명시 적 캐스트를 수행하는 대신

하지 않는 이유
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null; 

컴파일러에 암시 적 캐스팅 결정을 내리는 데 필요한 모든 정보가 나와있는 것 같습니다. ?의

두 번째 및 세 번째 피연산자 : 운영자 제어 조건식 유형

+5

본인이 직접 제목을 편집하지는 않지만 terrnary를 조건부로 변경하는 것이 좋습니다. 연산자를 조건부 연산자라고합니다. * a * 3 진 연산자 - 현재 유일한 연산자 - 그러나 피연산자 수 이외의 것은 설명하지 않습니다. –

+3

어쩌면 나는 더 윤이 나겠지만, 나는 ... –

+0

@MarcGravell 나는 건방지게 잘하면 바쁘다. 제목은'** the ** the conditional operator'이되어서는 안된다. :) –

답변

27

는 C# 3.0 사양의 관련 섹션 7.13, 조건 연산자이다. X와 Y를 두 번째와 세 번째 피연산자의 유형이라고합시다. 그러면

X와 Y가 같은 유형 인 경우 조건부 의 유형입니다. 그렇지 않으면 X에서 Y까지 암시 적 변환 (§6.1)이 존재하지만 Y에서 X가 아닌 암시 적 변환 (§6.1)이 존재하면 Y는 조건식의 타입 그렇지 않으면 Y에서 X까지 암시 적 변환 (§6.1)이 있지만 X에서 Y가 아닌 경우 X는 조건부 표현식의 유형입니다. 그렇지 않으면 표현식 유형을 결정할 수없고 컴파일 타임 오류가 발생합니다.

+6

요약하면 어떤 유형을 지정할지 고려하지 않는다. 조작의 결과 방정식 유형의 오른쪽을 알아 내려고 만합니다. Nullable 유형을 모르고 있습니다. – TheSoftwareJedi

+0

그러나 3 진 체인의 경우를 생각해 봅시다. 어떻게 알았 겠어? –

+0

@DJ Floetic : '가장 안쪽의'? : 연산자에서 시작하여 그 결과의 유형을 파악한 다음 그 방향을 작동시킵니다. –

14

특히 값 유형 일 때 할당을 기반으로 유형을 유추 할 수 없다는 것에 짜증이납니다. 당신이 대상 heirarchies 들어갈 때 비록 이유가 있습니다.

"ResultOfSomeCalc()"가 "int?"를 반환하면이 작동합니다. C#은 할당의 왼쪽에 관계없이 형식을 파악해야합니다. 따라서 null 또는 int를 반환 할 것이라고 컴파일러의 논리는 존재하지 않으므로 Nullable을 공통 분모로 대체 할 수 없습니다.

공지 이러한 변형이 일을하고, 당신이 이해하는 데 도움 수 :이 도움이

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null; 

object someValue = true ? (int?)ResultOfSomeCalc() : null; 

희망. 함수 ResultofSomeCalc은() int를 돌려 경우

+0

또한 아주 좋은 대답인데, 나는 DJ의 것을 받아 들였고 너의 것을 upvoted. –

0

또한보십시오? 다음이 작동합니다. 함수가 int를 돌려 경우

후 컴파일러는 경고를 'INT'와 ''나는 그 추측하고있어
을 사이에 암시 적 변환이 없기 때문에 조건식의 유형을 판별 할 수없는 당신이 무엇을보고있다 . 조건부 연산자 "? :"의 두 표현식 모두 동일한 유형이거나 암시 적 형변환을 통해 동일한 유형으로 변환 가능해야합니다.

ResultOfSomeCalc의 반환 유형을 int?로 변경하거나 null 표현식에 대한 형 변환이 필요합니다.

5

확실히 이것은 컴파일러가 알아야 할 것으로 보이지만 기본 키워드를 사용하여이 작업을 수행하는 다른 방법이 있습니다.

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?); 

기본이 사용은 잘 문서화하지 않는 것,하지만 작업을 수행이다 : 그것은 가장 작은 조금 덜 추한 캐스트에 비해 수 있습니다.최소한 그것은 당신이 마술 값으로 코드를 깔끔하게하는 것을 막는다. (나는 null/zero/false/등이 실제로 마술 값이라고 주장한다).

0

ResultOfSomeCalc()의 반환 유형을 nullabel int like (int?)로 변경하십시오.
int? someValue = (int?) SomeCondition? ResultofSomeCalc() : (int?) null;

관련 문제