编译时没有错误或警告,这怎么可能?
if (DateTime.Now == null) { }
编辑:
它变得更好了:
如果我对Decimal
,int
或用户定义的struct
执行相同操作,则会出现编译错误。
有什么区别?
答案 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”即使在作为引用类型加框时也总是有值。