조건부 연산자는 암시 적으로 캐스팅 할 수 없습니까?
나는이 작은 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
'developer tip' 카테고리의 다른 글
.net은 string에 UTF16 인코딩을 사용하지만 파일 저장을 위해 utf8을 기본값으로 사용하는 이유는 무엇입니까? (0) | 2020.12.05 |
---|---|
Tensorflow는 Windows 워크 플로와 호환 되나요? (0) | 2020.12.05 |
Google Org Chart API와 비교할 때 더 나은 자바 스크립트 조직도가 있습니까? (0) | 2020.12.05 |
Scala 컬렉션은 맵 작업에서 올바른 컬렉션 유형을 어떻게 반환 할 수 있습니까? (0) | 2020.12.05 |
함수 내부에서 파이썬 함수의 Docstring을 인쇄하는 방법은 무엇입니까? (0) | 2020.12.05 |