C# if statement shorthand operators (? :) results in unreachable code

Why do I get this warning in C# with Visual Studio 2010?

"Unreachable expression code detected"

from the following code (DateTime.Now underlined in green squiggly):

public DateTime StartDate
{
  get
  {
    DateTime dt = (DateTime)ViewState["StartDate"];
    return ((dt == null) ? DateTime.Now : dt);
  }
}
13
задан JohnB 17 August 2010 в 18:40
поделиться

6 ответов

Потому что структура DateTime никогда не может быть нулевой.

Если вы ожидаете возможное значение NULL, вы должны использовать структуру DateTime, допускающую значение NULL. Вы также можете использовать оператор объединения с нулем вместо условного оператора:

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

Или вы можете сделать это как однострочное (как в комментариях ):

public DateTime StartDate
{
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); }
}
38
ответ дан 1 December 2019 в 17:37
поделиться

Это могло быть потому, что DateTime - это структура (тип значения), а не ссылочный тип.
Следовательно, сравнение с нулевым значением всегда будет ложным.

3
ответ дан 1 December 2019 в 17:37
поделиться

DateTime не допускает значения NULL, поэтому его значение никогда не будет равно NULL.

1
ответ дан 1 December 2019 в 17:37
поделиться

Уже данные ответы - что тип значения, не допускающий значение NULL, никогда не будет нулевым, и поэтому известно, что сравнение возвращает false во время компиляции - верны, вы можете задаться вопросом очевидный последующий вопрос: почему это вообще законно ? Этот вопрос задавали много раз на SO; краткая версия состоит в том, что C # предоставляет «расширенный» оператор равенства для каждой структуры, которая предоставляет оператор равенства для типа, не допускающего значения NULL (если такой оператор еще не существует, конечно).

То есть, потому что DateTime предоставляет оператор ==, компилятор автоматически генерирует оператор == для DateTime ?, и этот оператор применим в вашем случае.

4
ответ дан 1 December 2019 в 17:37
поделиться

DateTime - это тип значения, поэтому он никогда не может быть нулевой. Следовательно, проверка на == null во время компиляции дает постоянное значение false, поэтому половина?: Никогда не будет достигнута во время выполнения.

4
ответ дан 1 December 2019 в 17:37
поделиться

DateTime не может быть нулевым

1
ответ дан 1 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: