Операторы сокращенных операторов С# if (?:) приводит к недостижимому коду

Почему я получаю это предупреждение на С# с Visual Studio 2010?

"Unreachable expression code detected"

из следующего кода (DateTime.Now подчеркнуто зеленым squiggly):

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

DateTime не может быть null

Ответ 6

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