c# - 为什么当 == 为 null 值返回 true 时 >= 返回 false?

标签 c# comparison operators nullable

我有两个 int 类型的变量? (或者 Nullable 如果你愿意的话)。我想对两个变量进行大于或等于 (>=) 比较,但事实证明,如果两个变量均为 null,则返回 false,而显然 == 运算符返回 true。

谁能向我解释为什么这是合乎逻辑的,因为 >= 运算符的语义定义包含“或”一词?

最佳答案

当该功能最初在 C# 2.0 中设计时,曾就此奇怪现象展开过激烈的辩论。问题是 C# 用户已经完全习惯了这种有意义的方式:

if(someReference == null)

将相等性扩展到可空值类型时,您有以下选择。

  1. 可空相等性真正提升。如果一个或两个操作数为空,则结果既不是真也不是假,而是空。在这种情况下,您可以:

    • a) 将 if 语句中的可空值类型相等设为非法,因为 if 语句需要一个 bool,而不是一个可空的 bool。相反,如果他们想要与 null 进行比较,则要求每个人都使用 HasValue。这是冗长且令人恼火的。

    • b) 自动将 null 转换为 false。这样做的缺点是,如果 x 为 null,x==null 将返回 false,这令人困惑,并且违背了人们对与引用类型进行 null 比较的理解。

  2. 可空相等性未解除。可为空的相等性要么为真要么为假,与空值的比较是空值检查。这使得可空相等与可空不等不一致。

这些选择显然都不是正确的;他们都有优点和缺点。例如,VBScript 选择 1b。经过多次争论,C# 设计团队选择了 #2。

关于c# - 为什么当 == 为 null 值返回 true 时 >= 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4399932/

相关文章:

sql - 搜索多个列表以查找缺失的条目

performance - 哪种素数生成算法最快?

Javascript 空字符串比较

java - 使用运算符创建字符串

c# - 为什么 if 语句有效但 switch 语句无效

c# - String.Format不接受第四个对象

c++ - 无法理解 C++ 中预递增/预递减的工作原理

c++ - 如果 (a) b = c, d = e, return; 为什么这将无法编译?

c# - 如何检查当前时区是否为 (UTC+9 :00) Osaka, Sapporo, Tokyo on other languages?

c# - Automapper 使用简单注入(inject)器 (Ioc) 将依赖项注入(inject)自定义类型转换器