IT story

널 입력 가능 유형 및 삼항 연산자 : 왜`?

hot-time 2020. 4. 9. 08:09
반응형

널 입력 가능 유형 및 삼항 연산자 : 왜`? 10 : 널 금지? [복제]


이 질문에는 이미 답변이 있습니다.

방금 이상한 오류가 발생했습니다.

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

그런 다음 다른 방법으로 다음과 같이하십시오.

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

이 메서드가 true를 반환하면 간단하게 Nullable intx에 10을 할당합니다 . 그렇지 않으면 널 입력 가능 정수에 널을 지정하십시오 . 그러나 컴파일러는 다음과 같이 불평합니다.

오류 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;

기본적으로 일어나는 일은 조건부 연산자가 표현식의 "반환 유형"을 결정할 수 없다는 것입니다. 컴파일러 implictitly 그 결정 이후 10이고 int그 다음이 식의 리턴 타입이 될 것으로 판단한다 int뿐만. 이 때문에 int수 없다 null(조건 연산자의 세 번째 피연산자)는 불평한다.

에 a를 캐스트함으로써 우리는 컴파일러에게이 표현식의 리턴 타입이 nulla Nullable<int>라고 명시 적으로 알립니다 Nullable<int>. 당신도 쉽게 캐스팅 할 10int?있었고 같은 효과를 낼 수있었습니다.


이 시도:

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


부수적으로, C # 컴파일러의 Microsoft 구현은 실제로 조건 연산자의 유형 분석을 매우 미묘하고 흥미로운 (나에게) 잘못받습니다. 그것에 관한 나의 기사는 Type 추론 화, Part 1 입니다.


다음 중 하나를 시도하십시오.

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

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

문제는 삼항 연산자가 첫 번째 매개 변수 할당을 기반으로 유형을 유추한다는 것입니다.이 경우 10은 nullable int가 아닌 int입니다.

당신은 더 나은 행운을 가질 수 있습니다 :

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

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

이것이 보이는 이유는 Nullable을 사용하는 장면 뒤에서 "null"이 Nullable의 null 인스턴스라는 것을 C #에 알려 주어야하기 때문입니다.


Explict 캐스트를 추가하십시오.

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

혼동되는 것은 삼항 연산자입니다. 두 번째 인수는 정수이므로 세 번째 인수도 정수로 간주되며 null이 맞지 않습니다.


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

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

반응형