C # if операторы сокращения (? :) приводят к недостижимому коду - PullRequest
13 голосов
/ 17 августа 2010

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

"Unreachable expression code detected"

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

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

Ответы [ 6 ]

38 голосов
/ 17 августа 2010

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

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

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

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

public DateTime StartDate
{
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); }
}
4 голосов
/ 18 августа 2010

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

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

4 голосов
/ 17 августа 2010

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

3 голосов
/ 17 августа 2010

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

1 голос
/ 17 августа 2010

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

1 голос
/ 17 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...