?:有条件运算符的可空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指定为nullable
为nullable
,以便为其分配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?)。