【发布时间】:2018-09-13 03:50:29
【问题描述】:
我昨天和一个朋友一起吃午饭,他们抱怨 C# 中的 null。他说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
检查相等性似乎很简单,这是我所期望的。然而,大于/小于语句是我觉得非常混乱的逻辑矛盾!这些不应该扔吗?否定操作如您所料抛出。
如果我尝试在 Ruby 或 Python 中使用 null 运行比较(除了相等性),我会收到一个类型错误,类似于“无法将数字与 nil 进行比较”。为什么 C# 不这样做?
【问题讨论】:
-
感谢阿伦!我看不出可空类型与逻辑命题有什么关系。什么意思?
-
这是标准行为,请参阅有关可空类型的文档:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 引入它们是为了简化与 SQL 数据库的交互(在 SQL 中,您有 3 值逻辑:true、false 和 null)跨度>
-
只是不要告诉你的朋友 JavaScript 有
undefined和null,或者NaN不等于它自己。 -
很多解释取决于您认为 null 的含义。有多种解释是自洽的。 C# 倾向于将 null 视为“未知”的意思。什么是 10+ 未知数?好吧,这也是未知的,所以 10 + null == null 是有道理的。 C# 还将未知映射为 false。 10
-
顺便提个很好的第一个问题 - 欢迎来到这个网站。