代码之家  ›  专栏  ›  技术社区  ›  Daniel Coffman

为什么条件运算符不正确地允许使用“null”为可为null的类型赋值?[复制品]

  •  8
  • Daniel Coffman  · 技术社区  · 14 年前

    可能重复:
    Nullable types and the ternary operator. Why won’t this work?
    Conditional operator assignment with nullable<value> types?

    这不会编译,说明“无法确定条件表达式的类型,因为”System.DateTime“和“”之间没有隐式转换。”

    task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null;
    

    这个很好用

     if (TextBoxActualEndDate.Text != "")
        task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text);
    else
        task.ActualEndDate = null;
    
    6 回复  |  直到 14 年前
        1
  •  8
  •   SLaks    14 年前

    这不起作用,因为编译器不会同时在两边插入隐式转换,并且 null 需要隐式转换才能成为可为空的类型。

    相反,你可以写

    task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
        DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?();
    

    这只需要一个隐式转换( DateTime DateTime? )

    或者,您可以铸造左侧:

    task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
        (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null;
    

    这也只需要一个隐式转换。

        2
  •  4
  •   Community Sam Holder    7 年前

    条件运算符不查看返回的值。它只查看被要求在日期时间和空值之间进行选择的值。它无法将这些实例标识为同一类型的实例(因为空不是有效的日期时间),因此出现了错误。你和我都知道 Nullable<DateTime> 可以执行该操作,但条件运算符不允许引入“更大”的类型:它只允许查看它选择的两个表达式的类型。(感谢 Aaronaught 在澄清这一点的评论和一个很好的澄清例子中。)

    要解决此问题,请通过强制转换日期时间给运算符一个提示:

    TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null;
                                      ^^^^^^^^^^^
    
        3
  •  1
  •   Community Sam Holder    7 年前

    这是的副本

    Nullable types and the ternary operator: why is `? 10 : null` forbidden?

    我的答案

    Conditional operator cannot cast implicitly?

    给出了一个与这个问题密切相关的分析。

    我也将在4月份和条件运算符一起写一篇关于类似问题的博客;请看博客了解详细信息。

        4
  •  0
  •   Keltex    14 年前

    原因是空值属于类型 object 因此,您必须将其强制转换为正确的类型,如下所示:

    task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
        DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null);
    
        5
  •  0
  •   Chris Marisic    14 年前

    最正确的方法是

    task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
        (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null);
    

    我经常以这种方式使用空的collaescing操作符。

        6
  •  0
  •   Asad    14 年前

    这是您在这种情况下可能遇到的错误:

    错误CS0173:条件类型 无法确定表达式 因为没有隐含的 “”和“int”之间的转换)

    编译器正在解释它不知道如何转换 null 变成一个 DateTime .


    修复:

    你需要 cast explicitly 这个 expression 可能会回来 无效的 nullable 类型。这会起作用

    ((DateTime?) null);