developer tip

조건부 연산자는 암시 적으로 캐스팅 할 수 없습니까?

optionbox 2020. 12. 5. 09:40
반응형

조건부 연산자는 암시 적으로 캐스팅 할 수 없습니까?


나는이 작은 C # 기이함에 약간 당황했습니다.

주어진 변수 :

Boolean aBoolValue;
Byte aByteValue;

다음 컴파일 :

if (aBoolValue) 
    aByteValue = 1; 
else 
    aByteValue = 0;

그러나 이것은 :

aByteValue = aBoolValue ? 1 : 0;

오류 메시지 : " 'int'유형을 'byte'로 암시 적으로 변환 할 수 없습니다."

물론이 괴물은 다음과 같이 컴파일됩니다.

aByteValue = aBoolValue ? (byte)1 : (byte)0;

여기서 무슨 일이 일어나고 있습니까?

편집하다:

VS2008, C # 3.5 사용


이것은 상당히 자주 묻는 질문입니다.

C #에서는 거의 항상 내부에서 외부로 추론합니다. 당신이 볼 때

x = y;

우리는 x의 유형이 무엇인지, y의 유형이 무엇인지, y 유형이 x와 할당 호환되는지 여부를 알아냅니다. 그러나 우리는 y의 유형을 계산할 때 x의 유형이 무엇인지 안다는 사실을 사용하지 않습니다.

x가 두 개 이상있을 수 있기 때문입니다.

void M(int x) { }
void M(string x) { }
...
M(y); // y is assigned to either int x or string x depending on the type of y

우리는 필요로 하는 식의 유형을 해결 할 수 없이 이 할당되고 있는지 알고. 유형의 정보 흐름 밖으로 하지, 표현의 표현.

조건식의 유형을 파악하기 위해 결과의 유형과 대체 식을 계산하고 두 유형 중 더 일반적인 유형을 선택하면 조건식의 유형이됩니다. 따라서 귀하의 예에서 조건식의 유형은 "int"이고 상수가 아닙니다 (조건식이 상수 true 또는 상수 false 인 경우 제외). 상수가 아니기 때문에 바이트에 할당 할 수 없습니다. 컴파일러는 결과가 상수가 아닌 경우 값이 아닌 유형에서만 추론합니다.

이러한 모든 규칙의 예외는 유형 정보 컨텍스트에서 람다로 흐르는 람다 식 입니다. 그 논리를 바로 잡는 것은 매우 어려웠습니다.


나는 VS 2005를 사용하고 있으며, bool & Boolean을 위해 재현 할 수 있지만 true는 아닙니다.

 bool abool = true;
 Boolean aboolean = true;
 Byte by1 = (abool ? 1 : 2);    //Cannot implicitly convert type 'int' to 'byte'
 Byte by2 = (aboolean ? 1 : 2); //Cannot implicitly convert type 'int' to 'byte'
 Byte by3 = (true ? 1 : 2);     //Warning: unreachable code ;)

가장 간단한 해결 방법은이 캐스트 인 것 같습니다.

 Byte by1 = (Byte)(aboolean ? 1 : 2);

그래서, 그렇습니다. 삼항 연산자는 상수가 그 유형을 int로 "고정"하도록하고 그렇지 않으면 더 작은 유형에 맞는 상수에서 얻을 수있는 암시 적 유형 변환을 비활성화하는 것 같습니다.


나는 당신에게 좋은 대답을 얻지 못할 수도 있지만 당신이 여러 곳에서 이것을한다면 당신은 다음과 같이 선언 할 수 있습니다.

private static readonly Byte valueZero = (byte)0;
private static readonly Byte valueOne = (byte)1;

그리고이 변수들. const프로젝트에 국한된 경우 사용 하지 않을 수 있습니다 .

편집 : 사용하는readonly것은 의미가 없습니다-이것은 결코 변경되지 않습니다.

참고 URL : https://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly

반응형