?:有条件运算符的可空types问题

有人可以解释为什么这在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); 

后一种forms给我一个编译错误“无法确定条件expression式的types,因为在'<null>'和'System.DateTime'之间没有隐式转换。

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

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

解决scheme很简单:

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

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

仅供参考(Offtopic,但漂亮,与可空types相关),我们有一个方便的操作符,仅用于可空types,称为空合并运算符

 ?? 

像这样使用:

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

这是因为在三元运算符中,这两个值必须parsing为相同的types。

另一个类似于接受的解决scheme是使用C#的default关键字。 虽然使用generics进行了定义,但它实际上适用于任何types。

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

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

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

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

此外,通过使用default ,您不需要将variables指定为nullablenullable ,以便为其分配null值。 编译器将自动分配特定variablestypes的默认值,不会遇到错误。 例:

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

我知道这个问题在2008年被问到,现在是5年后,但答案标记为答案不满足我。 真正的答案是DateTime是一个结构,作为一个结构它不兼容null。 你有两种解决方法:

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

其次是使DateTime与null兼容(例如,将DateTime转换为DateTime?)。