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);
}
}
Потому что структура 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); }
}
Это могло быть потому, что DateTime
- это структура (тип значения), а не ссылочный тип.
Следовательно, сравнение с нулевым значением всегда будет ложным.
DateTime не допускает значения NULL, поэтому его значение никогда не будет равно NULL.
Уже данные ответы - что тип значения, не допускающий значение NULL, никогда не будет нулевым, и поэтому известно, что сравнение возвращает false во время компиляции - верны, вы можете задаться вопросом очевидный последующий вопрос: почему это вообще законно ? Этот вопрос задавали много раз на SO; краткая версия состоит в том, что C # предоставляет «расширенный» оператор равенства для каждой структуры, которая предоставляет оператор равенства для типа, не допускающего значения NULL (если такой оператор еще не существует, конечно).
То есть, потому что DateTime предоставляет оператор ==, компилятор автоматически генерирует оператор == для DateTime ?, и этот оператор применим в вашем случае.
DateTime - это тип значения, поэтому он никогда не может быть нулевой. Следовательно, проверка на == null во время компиляции дает постоянное значение false, поэтому половина?: Никогда не будет достигнута во время выполнения.