2011-05-12 4 views
4

오류 또는 경고없이 컴파일됩니다. 어떻게 가능합니까?값 유형 임에도 불구하고 DateTime에서 null을 확인할 수있는 이유는 무엇입니까?

if (DateTime.Now == null) { } 

편집 :

그것은 더 나은 점점 : 나는 Decimal, int와 동일한 작업을 수행하거나 사용자가 struct을 정의한 경우

, 나는 컴파일러 오류가 발생합니다.

차이점은 무엇입니까?

+2

항상 거짓입니다. –

+0

컴파일러에서 사소한 결함이 발견되었을 수 있습니다. 당신이 얻은 DateTime에 null을 할당하려고한다면 null이 될 수 없기 때문에 null을 'System.DateTime'으로 변환 할 수 없습니다. –

+0

실수로 당신의 코멘트를 삭제했다고 생각합니다. 프리미티브 ... –

답변

2

블록에 코드를 넣으면 을 사용하여 연결할 수없는 코드를 경고하지만 IIRC는이 경고가 사라졌습니다 (문제가보고되었습니다).

"이유" 테스트가 언어 요구 사항에 따라 작동 할 수 있도록 합법적 인 암시 적 변환 (상자 또는 Null 가능)이 있기 때문입니다. 그러나 항상 false이고 IIRC 컴파일러는 명확하게 도달 할 수없는 코드 (경고에 대한 부끄러움)를 없애기에 충분히 똑똑합니다. 여기에 대한 답 (ReSharper에서 같은)

여러 코드 분석 도구 것이다 "항상 false"로 플래그를하고 다음 코드로 도달 할 수있는

+0

또한 참고하시기 바랍니다 : https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=348850 –

+0

@codymanix * 경고 * IIRC (오류가 아님) 여야하며 정의 된 운영자에 따라 다릅니다. 나는 연결 문제가 조합을 언급했다는 것을 기억하는 것 같다. .. –

2

모든 값 유형을 null과 비교할 수 있습니다. 그러나 값 유형이 널이 될 수 없기 때문에 항상 false입니다.

허용되는 이유는 .NET의 모든 유형 (System.ValueType에서 직접 상속하는 형식 포함)은 == 연산자를 정의하는 System.Object에서 상속됩니다. 즉, 모든 유형을 참조 평등을 위해 비교할 수 있습니다. 그러나 CLR은 아주 깊은 수준에서 항상 ValueType "참조"가 참조 유형으로 묶을 때에도 항상 값을 갖기 때문에 ValueTypes는 null로 평가되지 않습니다.

관련 문제