为什么对于空值 > = 返回 false 时 = = 返回 true?

我有两个 int 类型的变量?(或 Nullable < int > ,如果愿意的话)。我想对这两个变量进行大于或等于(> =)的比较,但结果是,如果两个变量都为空,则返回 false,而 = = 操作符显然返回 true。

有人能解释一下为什么这是合乎逻辑的,因为 > = 运算符的语义定义包含了单词“ or”吗?

8733 次浏览

NULL 不是零(数值或二进制值)、长度为零的字符串或空白(字符值)。 所以任何比较运算符都会返回 false。 点击这里了解更多信息

因为“相等”是与“可比性”分开定义的。
你可以测试 x == null,但是 x > null是没有意义的。

>=对数值进行操作; 该值不为空。

您可以使用 超载>=操作符来提供您所需要的特定类型。

另一种描述’> =’的方法是:。没有提到平等。一旦不等式测试中的操作数之一为 Null,结果也是未知的(为 Null)。但是,如果您想知道两个操作数是否都为 Null,那么 Null = = Null 是一个合理的测试(应该会得到 true)。去掉运算符的不等式部分就会有所不同。

下面来自 http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4的代码示例总结了 C # 是如何对待 Null 的:

int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
// This clause is selected, but num1 is not less than num2.
Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");
}


if (num1 < num2)
{
Console.WriteLine("num1 is less than num2");
}
else
{
// The else clause is selected again, but num1 is not greater than
// or equal to num2.
Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");
}


if (num1 != num2)
{
// This comparison is true, num1 and num2 are not equal.
Console.WriteLine("Finally, num1 != num2 returns true!");
}


// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
// The equality comparison returns true when both operands are null.
Console.WriteLine("num1 == num2 returns true when the value of each is null");
}


/* Output:
* num1 >= num2 returned false (but num1 < num2 also is false)
* num1 < num2 returned false (but num1 >= num2 also is false)
* Finally, num1 != num2 returns true!
* num1 == num2 returns true when the value of each is null
*/

当这个特性最初是在 C # 2.0中设计的时候,关于这个古怪的特性有一个巨大的争论。问题是 C # 用户已经完全习惯了这一点:

if(someReference == null)

当将相等性扩展到可为空的值类型时,可以选择以下选项。

  1. Nullable equality is truly 解除了. If one or both of the operands is null then the result is neither true, nor false, but null. In this case you can either:

    • A)在 if语句中使用可为空的值类型相等是非法的,因为 if语句需要一个 bool,而不是一个可为空的 bool。相反,要求每个人都使用 HasValue,如果他们想要比较为空。真是冗长又烦人。

    • B)自动将 null 转换为 false。这样做的缺点是,如果 x 为 null,则 x==null返回 false,这会造成混淆,并且不利于人们理解使用引用类型进行 null 比较。

  2. 不取消可为空的相等性。可为空的相等性为 true 或 false,与 null 的比较为空检查。这使得可为空的等式与可为空的不等式不一致。

这些选择没有一个是明显正确的,它们都有利有弊。例如,VBScript 选择1b。经过多次讨论,C # 设计团队选择了 # 2。

您期望什么值?

null == null true

Null > = null false

无效,无效,无效

Null < = null false

null < null false

无效! = 无效错误

1 = = null false

1 >= null false

1 > 无错

1 <= null false

1 < null false

1! = null true aka! (1 = = null)

> = 仅表示“大于或等于”,如果以特定的定义明确的方式使用的话。当在带有重载操作符的类上使用时,它表示类开发人员希望它表示的任何内容。当应用到类似字符串的类时,它可能意味着“排序相同或更高”,也可能意味着“相同长度或更长”。

因为在默认情况下,int不能为 null,并且它的值将被设置为 0,> 和 < 的操作符是为 int类型构建的,它希望使用 values而不是 nulls

请参阅我对类似问题的回答,其中我写了一些使用 less <greater >操作符 https://stackoverflow.com/a/51507612/7003760处理 nullable int的方法