programing

null 가능한 유형 및 3진수 연산자: '? 10: null'이 금지된 이유는 무엇입니까?

instargram 2023. 5. 27. 09:37
반응형

null 가능한 유형 및 3진수 연산자: '? 10: null'이 금지된 이유는 무엇입니까?

방금 이상한 오류를 발견했습니다.

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

다른 방법으로 다음과 같은 것을 들 수 있습니다.

int? x = GetBoolValue() ? 10 : null;

단순, 메서드가 true를 반환하면 Nullable에 10을 할당합니다.int그렇지 않으면 null을 null 가능한 int에 할당합니다.그러나 컴파일러는 다음과 같이 불평합니다.

오류 1 사이에 암시적 변환이 없으므로 조건식 유형을 확인할 수 없습니다.int그리고.<null>.

제가 미쳐가나요?

컴파일러는 먼저 오른쪽 표현식을 평가하려고 합니다.

GetBoolValue() ? 10 : null

10이다.int문자 그대로의int?) 및null그건, 음,null이 둘 사이에는 암묵적인 변환이 없으므로 오류 메시지가 표시됩니다.

오른쪽 식을 다음 중 하나로 변경하면 다음 사이에 암묵적인 변환이 있기 때문에 컴파일됩니다.int?그리고.null(#1) 및 사이int그리고.int?(#2, #3).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3

사용해 보십시오.

int? x = GetBoolValue() ? 10 : (int?)null;

기본적으로 조건부 연산자는 식의 "반환 유형"을 결정할 수 없습니다.컴파일러가 암묵적으로 결정하기 때문에10이다.int그런 다음 이 표현식의 반환 유형은 다음과 같아야 한다고 결정합니다.int뿐만 아니라.그 이후로int있을 수 없는null(조건부 연산자의 세 번째 피연산자) 그것은 불평합니다.

캐스팅을 통해null아주Nullable<int>우리는 컴파일러에게 이 표현식의 반환 유형이 다음과 같아야 한다고 명시적으로 말하고 있습니다.Nullable<int>당신은 쉽게 캐스팅할 수 있었습니다.10로.int?또한 동일한 효과를 보였습니다.

사용해 보십시오.

int? result = condition ? 10 : default(int?);

덧붙여서, C# 컴파일러의 Microsoft 구현은 실제로 조건 연산자의 유형 분석을 매우 미묘하고 흥미로운 방식으로 잘못 이해합니다.그것에 대한 제 기사는 유형 추론 문제, 1부(2006-05-24)입니다.

다음 중 하나를 사용해 보십시오.

int? x = GetBoolValue() ? (int?)10 : null;

int? x = GetBoolValue() ? 10 : (int?)null;

문제는 3차 연산자가 첫 번째 매개 변수 할당을 기반으로 유형을 추론하고 있다는 것입니다.이 경우 10, 이것은 nullable int가 아닌 int입니다.

다음과 같은 이점이 있습니다.

int? x = GetBoolValue() (int?)10 : null;
int? x = GetBoolValue() ? 10 : (int?)null;

이것이 표시되는 이유는 Nullable을 사용하는 장면 뒤에서 C#에게 "null"이 Nullable의 Null 인스턴스임을 알려야 하기 때문입니다.

명쾌한 출연진을 추가하면 됩니다.

int? x = GetBoolValue() ? 10 : (int?)null;

혼동되는 것은 3차 연산자입니다. 두 번째 인수는 정수이고 세 번째 인수도 정수로 예상되며 null은 적합하지 않습니다.

컴파일러가 결과를 할당하는 것이 아니라 두 번째와 세 번째 피연산자로 조건부 연산자의 유형을 결정하기 때문입니다.정수와 null 참조 사이에는 컴파일러가 유형을 결정하는 데 사용할 수 있는 직접 캐스트가 없습니다.

언급URL : https://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden

반응형