2011-05-12 68 views
4

这个编译没有错误或警告,这怎么可能?为什么我可以检查DateTime为null,即使它是一个值类型?

if (DateTime.Now == null) { } 

编辑:

它变得更好:

如果我做同样的Decimalint或用户定义struct,我得到一个编译错误。

有什么区别?

+2

它永远是错误的。 – 2011-05-12 16:12:06

+0

您可能在编译器中发现了一个小毛病。如果您尝试将null分配给DateTime,您将得到:无法将null转换为“System.DateTime”,因为它是不可为空的值类型 – 2011-05-12 16:23:39

+0

我认为我意外删除了您的评论,但我确实回复了您的后续观点原始... – 2011-05-12 16:24:17

回答

2

如果你在代码块中,使用警告无法访问的代码,但IIRC此警告消失(该问题已被报告)。

至于“为什么”;因为存在允许测试按照语言要求工作的合法隐式转换(框或可空)。但是,它始终是false,而且IIRC编译器足够聪明,可以清除明显无法访问的代码(关于警告很遗憾)。在这里回答

几个代码分析工具(如ReSharper的),将其标记为“永远为假”和随后的代码为不可达

+0

另请参阅:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=348850 – 2011-05-12 16:15:39

+0

@codymanix它应该是*警告* IIRC(不是错误),并且它取决于所定义的操作符。我似乎记得连接问题说明了组合.. – 2011-05-12 16:22:39

2

您可以比较任何值类型为空。但是,它始终是错误的,因为值类型不能为空。至于为什么允许它,.NET中的所有类型(包括那些直接从System.ValueType继承的类型)都继承自System.Object,它定义了一个==运算符。这意味着每种类型都可以通过参照平等进行比较。但是,ValueTypes永远不会计算为null,因为CLR始终确保在非常深的级别上,即使装箱为引用类型时,ValueType“references”也始终具有值。

相关问题