C# 조건 연산자(?:)의 암시적 유형 변환 제한
C#의 조건 연산자(?:)는 간결한 조건 분기 구문을 제공합니다. 그러나 암시적 유형 변환과 관련하여 예기치 않은 동작이 나타나는 경우가 있습니다.
다음 코드 조각을 고려하세요.
<code class="language-csharp">bool aBoolValue; byte aByteValue; // 这段代码可以成功编译 if (aBoolValue) aByteValue = 1; else aByteValue = 0; // 这段代码编译失败,并出现错误:“无法将类型“int”隐式转换为“byte”。 aByteValue = aBoolValue ? 1 : 0;</code>
첫 번째 코드 조각은 컴파일되지만 두 번째 코드 조각은 실패하는 이유는 무엇입니까?
C#에서 유형 추론의 역할
컴파일러는 코드를 분석할 때 변수와 표현식이 사용되는 컨텍스트에 따라 유형을 결정합니다. 이 프로세스를 유형 추론이라고 합니다. 일반적으로 유형 유추는 내부가 아닌 표현식 외부에서 유추됩니다.
첫 번째 코드 조각에서 컴파일러는 if-else 문의 각 분기에 대한 할당을 기반으로 aByteValue 유형을 추론합니다. aByteValue에는 1 또는 0 값이 할당되며 두 값 모두 바이트입니다. 따라서 컴파일러는 aByteValue가 바이트라고 추론합니다.
조건식의 의미
조건 연산자는 결과 표현식과 대체 표현식이라는 두 가지 표현식을 평가합니다. 조건식의 유형은 두 표현식 중 보다 일반적인 유형입니다.
두 번째 코드 조각에서는 결과 표현식과 대체 표현식이 모두 정수(각각 1과 0)로 평가됩니다. 따라서 컴파일러는 조건식이 int 유형이라고 추론합니다.
호환형으로 변환
조건식은 int로 평가되므로 암시적으로 바이트로 변환할 수 없습니다. 이 문제를 해결하려면 다음 코드와 같이 명시적으로 표현식을 바이트로 변환해야 합니다.
<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>
위 내용은 C#의 조건 연산자(?:)가 때때로 암시적 유형 캐스팅에 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!