누군가 이것이 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
변수를 지정할 필요가 없습니다 . 컴파일러는 특정 변수 유형의 기본값을 자동으로 할당하며 오류가 발생하지 않습니다. 예:nullable
null
DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);
답변
