为何C#编译器对null的逻辑比较不抛出异常?
吐槽C#里null的“反逻辑”行为?我实测了一波
昨天和朋友吃午饭唠技术,他吐槽C#里的null完全不符合逻辑,说这玩意儿违反基本逻辑规则。我听完有点好奇,索性写了几个简单的测试用例验证他的说法:
Console.WriteLine(null == null); //True //Console.WriteLine(null == !!null); //BOOM,直接抛异常 Console.WriteLine(10 >= null); //False Console.WriteLine(10 <= null); //False Console.WriteLine(!(10 >= null)); //True Console.WriteLine(!(10 <= null)); //True
结果看完确实有点颠覆常识:
- 相等性判断
null == null返回True,这部分还算符合直觉,毕竟两个“空引用”确实是等价的。 - 但尝试
null == !!null直接炸锅——因为!!null会试图把null转换成bool类型,而C#里null不能直接隐式转bool,直接就抛出NullReferenceException了,这操作确实够反常识。 - 最诡异的是数值和null的比较:
10 >= null和10 <= null居然都返回False!按照经典逻辑,对于任意两个值a和b,要么a≥b要么a≤b,这是排中律的基本体现,但这里两个判断全是False,反过来取反后又都成了True,完全不符合常规逻辑认知。
其实这背后是C#对nullable类型的比较规则:当值类型和null比较时,null会被当作Nullable<T>的空值,而C#里Nullable<T>的比较逻辑是只要有一方为空且不是相等判断,结果就返回False。但从纯逻辑的角度看,这种行为确实显得“不合逻辑”,也难怪朋友会吐槽了。
内容的提问来源于stack exchange,提问作者Pookchop
相关产品推荐
相关产品推荐

