代码之家  ›  专栏  ›  技术社区  ›  Raumornie

三元运算符和C#中的if语句之间有区别吗?[副本]

  •  3
  • Raumornie  · 技术社区  · 14 年前

    我正在处理一个可以为空的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;
        }
    

    据我所知,带有三元运算符的行应该与前面的四行相同,但是VS2010给了我一个编译错误,说在 <null> 和DateTime(即使所讨论的对象是“DateTime?”)。关于三元运算符,我应该知道些什么吗?还是这个(喘息?)虫子?

    5 回复  |  直到 14 年前
        1
  •  10
  •   Michael Petrotta user3140870    14 年前

    中的两个元素 ?: 操作人员 应该 是同一类型的(但不一定要-请参阅下面的详细信息)。铸造 null DateTime? :

    dt = (check == DateTime.MinValue) ? (DateTime?)null : ...
    

    spec

    如果X和Y是同一类型,则这是条件表达式的类型。

    • 否则,如果存在从X到Y的隐式转换(第6.1节),但不存在从Y到X的隐式转换,则Y是条件表达式的类型。
    • 否则,如果存在从Y到X的隐式转换(第6.1节),但不存在从X到Y的隐式转换,则X是条件表达式的类型。

    (有趣的是,它实际上并不是所谓的“三元”运算符。它是 一种可能 三值(三值)运算符,我不知道C#中还有其他运算符。它叫“?“接线员,发音有点难。也称为“条件”运算符。)

        2
  •  3
  •   JaredPar    14 年前

    有几个答案错误地指出,条件运算符的两个值必须是同一类型。这显然是不真实的,在语言规范的第7.13节中有详细介绍

    从规范(X和Y是这两个值的类型)

    • 否则,如果存在从X到Y的隐式转换(§6.1),而不是从Y到X的隐式转换,则Y是条件表达式的类型。
    • 否则,如果存在从Y到X的隐式转换(§6.1),但不存在从X到Y的隐式转换,则X是条件表达式的类型。

    第二种和第三种情况允许类型不同,只要存在从一种类型到另一种类型的隐式转换(但不返回)。

    DateTime ?

    DateTime? dt = (check == DateTime.MinValue) 
      ? (DateTime?)null
      : Viewer.ActiveThroughUTC.ToLocalTime();
    
        3
  •  0
  •   Charles Bretana    14 年前

    dt = (check == DateTime.MinValue) ? (DateTime?)null : 
            (DateTime?)Viewer.ActiveThroughUTC.ToLocalTime();   
    

    可能不需要对第二个参数(real dateime)进行强制转换,因为存在隐式强制转换fropm DateTime DateTime? (DateTime?)null 告诉编译器将其强制转换为。。。

        4
  •  0
  •   Jonathan Allen    14 年前

    使用新的日期时间?()instread为空。这样它就知道表达式应该是什么类型。

    dt = check == DateTime.MinValue ? new DateTime?() : DateTime.Now;
    
        5
  •  0
  •   Nick Craver    14 年前

    conditional 语句的返回选项必须属于同一类型(或只有一个最可能是隐式可转换的),即编译器推断为空的隐式转换:

    dt = null;
    

    不发生在这里(如果它们不同,第一个应该转换成第二个吗?或者反之亦然?),所以每个选项的返回类型

    dt = check == DateTime.MinValue ? (DateTime?)null : Viewer.ActiveThroughUTC.ToLocalTime();