Операторы сокращенных операторов С# 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, поэтому его значение никогда не будет равно нулю.