为什么我可以将DateTime检查为null,即使它是值类型?

时间:2011-05-12 16:08:31

标签: c# .net struct null value-type

编译时没有错误或警告,这怎么可能?

if (DateTime.Now == null) { }

编辑:

它变得更好了:

如果我对Decimalint或用户定义的struct执行相同操作,则会出现编译错误。

有什么区别?

3 个答案:

答案 0 :(得分:2)

如果您将代码放入块中,则使用警告无法访问的代码,但IIRC此警告消失(已报告此问题)。

至于“为什么”;因为存在合法的隐式转换(box或nullable),允许测试按照语言要求工作。但是,它始终是false,而IIRC编译器足够聪明,可以删除明显无法访问的代码(关于警告的耻辱)。

答案 1 :(得分:2)

Why can TimeSpan and Guid Structs be compared to null?

这里的答案很好解释

多个代码分析工具(如Resharper)会将其标记为“始终为false”,后续代码为无法访问。

答案 2 :(得分:2)

您可以将任何值类型与null进行比较。但是,它始终为false,因为值类型永远不能为空。

至于为什么允许它,.NET中的所有类型(包括那些直接从System.ValueType继承的类型)都继承自System.Object,它定义了一个==运算符。这意味着可以比较每种类型的参考平等。但是,ValueTypes永远不会计算为null,因为CLR总是在非常深的层次上确保ValueType“references”即使在作为引用类型加框时也总是有值。