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

时间:2008-11-17 15:18:36

标签: c# generics nullable conditional-operator

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

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

......但这不是:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

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

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

5 个答案:

答案 0 :(得分:315)

这个问题已被问过很多次了。编译器告诉您它不知道如何将null转换为DateTime

解决方案很简单:

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);

请注意,Nullable<DateTime>可以写成DateTime?,这样可以省去一堆打字。

答案 1 :(得分:19)

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

??

像这样使用:

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

答案 2 :(得分:8)

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

答案 3 :(得分:4)

另一种类似于接受的解决方案是使用C#的default关键字。虽然使用泛型定义,但它实际上适用于任何类型。

应用于OP问题的示例用法:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

使用当前接受的答案的示例用法:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

此外,通过使用default,您无需将变量指定为nullable,以便为其分配null值。编译器将自动分配特定变量类型的默认值,不会遇到任何错误。例如:

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);

答案 4 :(得分:3)

我知道这个问题是在2008年提出的,现在已经过了5年,但答案标记为答案并不能让我满意。真正的答案是DateTime是一个结构,作为一个结构,它与null不兼容。你有两种解决方法:

首先使null与DateTime兼容(例如,将null转换为DateTime?作为具有70个upvotes的绅士建议,或者将null转换为Object或ValueType)。

第二个是使DateTime与null兼容(例如,将DateTime转换为DateTime?)。