Nullable类型问题?:条件运算符

Nic*_*tch 154 c# generics nullable conditional-operator

有人可以解释为什么这在C#.NET 2.0中有效:

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);
Run Code Online (Sandbox Code Playgroud)

......但这不是:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);
Run Code Online (Sandbox Code Playgroud)

后一种形式给我一个编译错误"无法确定条件表达式的类型,因为'<null>'和'System.DateTime'之间没有隐式转换."

并不是说我不能使用前者,但第二种风格与我的其余代码更加一致.

Ste*_*son 322

这个问题已经被问过很多次了.编译器告诉你它不知道如何转换nullDateTime.

解决方案很简单:

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);
Run Code Online (Sandbox Code Playgroud)

请注意,Nullable<DateTime>可以写入DateTime?,这将节省您一堆打字.

  • 我想补充一点,编译器试图猜测三元运算的结果类型,而不是通过查看它所分配的变量,而是通过查看操作数.它找到`<null>`和`DateTime`而不是找到共同的祖先类型,它只是试图找到彼此之间的转换.(额外位:C#识别`<null>`类型,即每个`null`表达式的类型.) (4认同)

Fly*_*wat 19

FYI(Offtopic,但很漂亮并且与可空类型有关)我们有一个方便的运算符,仅用于可空类型,称为空合并运算符

??
Run Code Online (Sandbox Code Playgroud)

像这样使用:

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);
Run Code Online (Sandbox Code Playgroud)

  • 这是如何回答他的问题的? (8认同)
  • 因此,FYI,offtopic但是一件好事要知道. (4认同)
  • 如果某些条件为真,Nick会尝试为foo分配null。如果foo为空,则空合并将为DateTime(0)赋值。两者是完全无关的。 (3认同)

Moj*_*ter 8

这是因为在三元运算符中,这两个值必须解析为相同的类型.

  • 不,他们不必是同一类型.第二个操作数必须可以隐式转换为第三个操作数的类型,反之亦然. (9认同)