[C#] ?의 nullable 형식 문제 : 조건부 연산자

누군가 이것이 C # .NET 2.0에서 작동하는 이유를 설명 할 수 있습니까?

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

…하지만 그렇지 않습니다 :

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

후자의 형식은 ” ‘null>’과 ‘System.DateTime’사이에 암시 적 변환이 없기 때문에 조건식의 유형을 확인할 수 없습니다.”라는 컴파일 오류를 나타냅니다.

전자를 사용할 수는 없지만 두 번째 스타일은 나머지 코드와 더 일관성이 있습니다.



답변

이 질문은 이미 여러 번 요청되었습니다. 컴파일러는 어떻게 변환 모르는 당신을 말하고있다 null로를 DateTime.

해결책은 간단합니다.

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);

참고 Nullable<DateTime>쓸 수있는 DateTime?당신에게 입력의 무리를 저장합니다.


답변

FYI (주제이지만 깔끔하고 nullable 유형과 관련 있음) null 병합 연산자라는 nullable 유형에 대한 편리한 연산자가 있습니다.

??

이런 식으로 사용 :

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);


답변

삼항 연산자에서는 두 값이 동일한 유형으로 해석되어야하기 때문입니다.


답변

이 질문이 2008 년에 요청되었으며 5 년이 지난 지금도 답변으로 표시된 답변이 만족스럽지 않습니다. 진정한 대답은 DateTime이 구조체이며 구조체로 null과 호환되지 않는다는 것입니다. 이를 해결하는 두 가지 방법이 있습니다.

첫 번째는 null을 DateTime과 호환 가능하게 만드는 것입니다 (예를 들어 70 개의 공감 율이있는 신사가 제안한대로 null을 DateTime?으로 캐스팅하거나 Object 또는 ValueType으로 null을 캐스팅).

두 번째는 DateTime을 null과 호환 가능하게 만드는 것입니다 (예 : DateTime을 DateTime으로 캐스트?).


답변

허용되는 것과 비슷한 또 다른 솔루션은 C #의 default키워드를 사용하는 것입니다. 제네릭을 사용하여 정의되었지만 실제로는 모든 유형에 적용 할 수 있습니다.

OP의 질문에 적용된 사용 예 :

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

현재 허용되는 답변의 사용법 예 :

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

또한을 사용하여 값 을 할당하기 위해 default변수를 지정할 필요가 없습니다 . 컴파일러는 특정 변수 유형의 기본값을 자동으로 할당하며 오류가 발생하지 않습니다. 예:nullablenull

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);


답변