C#if语句简写操作符(?:)导致无法访问的代码

Joh*_*hnB 13 c# asp.net if-statement visual-studio

为什么我在使用Visual Studio 2010的C#中收到此警告?

"Unreachable expression code detected"
Run Code Online (Sandbox Code Playgroud)

从以下代码(DateTime.Now绿色波浪形下划线):

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

Jus*_*ner 38

因为DateTime结构永远不能为null.

如果您期望可能的空值,则必须使用可为空的DateTime结构.您也可以使用null-coalescing运算符而不是条件运算符:

public DateTime StartDate
{
    get
    {
        DateTime? dt = (DateTime?)ViewState["StartDate"];
        return dt ?? DateTime.Now;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以做一个单行(如评论中所示):

public DateTime StartDate
{
    get { return (DateTime)(ViewState["StartDate"] ?? DateTime.Now); }
}
Run Code Online (Sandbox Code Playgroud)

  • @Blam:在ASP.NET中,如果ViewState键不存在,则会得到"null".我常常用@Justin表达同样的东西:`return(DateTime)(ViewState ["StartDate"] ?? DateTime.Now);`.奇迹般有效. (5认同)
  • @Anthony:确定空合并运算符的结果类型的确切规则非常复杂,但通常会产生明智的结果.毕竟,运算符的意图是*消除空值*,所以如果我们可以侥幸逃脱它,我们想要转到非可空类型.有关详细信息,请参阅语言规范 (3认同)