C#中的三元运算符和if语句之间是否存在差异?

Rau*_*nie 3 c# ternary-operator

我正在使用可以为空的DateTime对象并遇到一些奇怪的行为.这是一个示例函数:

    public DateTime? Weird()
    {
        DateTime check = DateTime.Now;
        DateTime? dt;
        if (check == DateTime.MinValue)
            dt = null;
        else
            dt = Viewer.ActiveThroughUTC.ToLocalTime();

        //this line give a compile error
        dt = (check == DateTime.MinValue) ? (null) : (Viewer.ActiveThroughUTC.ToLocalTime());
        return dt;
    }
Run Code Online (Sandbox Code Playgroud)

据我所知,三元运算符的行应与前四行相同,但VS2010给出了一个编译错误,说没有<null>和DateTime 之间存在转换(即使有问题的对象是'DateTime' ?').有什么我应该知道的关于三元运算符的东西还是这个(喘气?)一个错误?

Mic*_*tta 10

?:运算符中的两个元素应该是相同的类型(但不一定是 - 请参阅下面的详细信息).演员nullDateTime?:

dt = (check == DateTime.MinValue) ? (DateTime?)null : ...
Run Code Online (Sandbox Code Playgroud)

规格:

?:运算符的第二个和第三个操作数控制条件表达式的类型.设X和Y是第二个和第三个操作数的类型.然后,

如果X和Y是相同的类型,那么这是条件表达式的类型.

  • 否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型.
  • 否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型.
  • 否则,无法确定表达式类型,并发生编译时错误.

(有趣的是,它实际上并不称为"三元"运算符.它是一个可能的三元(三值)运算符,我不知道C#中的任何其他运算符.它被称为"?:"运算符,这有点难发音.也称为"条件"运算符.)


归档时间:

查看次数:

1702 次

最近记录:

15 年,3 月 前