2010-08-17 2 views
13

Visual Studio 2010에서 C#으로 경고 메시지가 나타나는 이유는 무엇입니까? 다음 코드 (DateTime.Now는 구불 구불 한 녹색 밑줄)에서C# if 문 요약 연산자 (? :)로 연결할 수없는 코드가 발생합니다.

"Unreachable expression code detected" 

:

public DateTime StartDate 
{ 
    get 
    { 
    DateTime dt = (DateTime)ViewState["StartDate"]; 
    return ((dt == null) ? DateTime.Now : dt); 
    } 
} 
+4

'DateTime'이 (가) 구조이므로 'null'이 될 수 없습니다. 그래서 내 'ViewState'에서 확인할 값은 무엇입니까? – JohnB

+0

'도달 할 수없는 표현식'은'항상 (TRUE | FALSE)로 평가됩니다'와 거의 비슷하게 들립니다 ...'dt'가'null' 일 수 있습니까? 아니면 고전적인'if {} else {}'가 잘 동작합니까? –

+0

오타 : 그렇다면 'ViewState'가 비어있는 경우 어떤 값을 확인해야합니까? – JohnB

답변

38

날짜 시간 구조체가 null이 될 수 없다 때문입니다.

null 값이있을 것으로 예상되는 경우 nullable DateTime 구조체를 사용해야합니다.

public DateTime StartDate 
{ 
    get 
    { 
     DateTime? dt = (DateTime?)ViewState["StartDate"]; 
     return dt ?? DateTime.Now; 
    } 
} 

또는 당신은 (the comments에서와 같이) 한 라이너로 할 수있는 : 당신은 또한뿐만 아니라 대신 조건 연산자의 널 병합 연산자를 사용할 수

public DateTime StartDate 
{ 
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); } 
} 
+1

그래서 "StartDate"키가 존재하지 않으면 어떻게됩니까? – Blam

+5

@Blam : ASP.NET에서 ViewState 키가 없으면'null'이됩니다. 나는 한 줄짜리로'@Justin '과 똑같은 것을 표현한다 :'return (DateTime) (ViewState [ "StartDate"]? DateTime.Now);'. 매력처럼 작동합니다. – kbrimington

+0

@Blam : 나는 그저 내 자신에게 묻는 과정에 있었다! @ Justin : 훌륭한 솔루션, 감사합니다! – JohnB

3

하는 것이 될 수있다 DateTime은 구조체 (값 유형) &이 아니기 때문에 참조 유형이 아닙니다.
따라서 null과 비교하면 항상 false가됩니다.

1

DateTime은 null 일 수 없습니다.

4

DateTime은 값 유형이므로 null 일 수 없습니다. 따라서 == null에 대한 테스트는 컴파일 타임에 상수 false로 평가되므로 런타임에? :의 ​​절반에 도달하지 않습니다.

1

DateTime은 nullable이 아니므로 해당 값은 절대로 null이 될 수 없습니다.

4

이미 제공된 답변 - nullable이 아닌 값 유형은 결코 null이 아니므로 비교시 컴파일 시간에 false를 반환하는 것으로 알려져 있습니다. 맞다면 확실한 후속 질문에 대해 궁금 할 것입니다 : 의 합법적인가요? 그 질문은 여러 번 물었습니다. 짧은 버전은 C#이 nullable 형식이 아닌 경우에 동등 연산자를 제공하는 모든 구조체에 대해 "해제 된"등호 연산자를 제공한다는 것입니다.

즉, DateTime은 == 연산자를 제공하고 컴파일러는 DateTime?에 == 연산자를 자동으로 생성하고 연산자를 사용할 수 있습니다.

+0

자주 묻는 질문입니다. 컴파일러가 다른 경고를 내 보내지 않는 이유는 무엇입니까? _ 'System.DateTime'형식의 값이 'System.DateTime?'형식의 'null'과 결코 같지 않기 때문에 식의 결과는 항상 '거짓'입니다. 이 경고는'42 == null'에서와 같이 해제 된 내장형 항등 연산자'=='는 (적어도 대부분의 유형에서) 작동하지만 사용자 정의 연산자'=='에 대해서는 작동하지 않습니다. DateTime'을 해제합니다. –

+1

@JeppeStigNielsen : 누락 된 경고는 버그였습니다. C# 3에서 소개 한 것으로 의심됩니다. Microsoft에 있었을 때 완전히 조사하는 것이 결코 중요하지 않았습니다. 나는 그것이 Roslyn에 고정되었는지 여부를 모른다. 나는 그 잘못을 후회한다. –