为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
有只小跳蛙 2019-09-20 17:00:57
有人可以解释为什么这在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);后一种形式给我一个编译错误“无法确定条件表达式的类型,因为'<null>'和'System.DateTime'之间没有隐式转换。”并不是说我不能使用前者,但第二种风格与我的其余代码更加一致。
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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


解决方案很简单:


DateTime? foo;

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

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


查看完整回答
反对 回复 2019-09-20
?
翻阅古今

TA贡献1780条经验 获得超5个赞

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);


查看完整回答
反对 回复 2019-09-20
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

类似于接受的另一个解决方案是使用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);


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 310 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信