当==为空值返回true时,为什么> =返回false?

时间:2010-12-09 15:31:58

标签: c# comparison operators nullable

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

有人可以向我解释为什么这是合乎逻辑的,因为> =运算符的语义定义包含单词“or”?

8 个答案:

答案 0 :(得分:95)

当该功能最初是在C#2.0中设计的时候,关于这种奇怪性的争论很激烈。问题是C#用户完全习惯这是有意义的:

if(someReference == null)

将等式扩展为可空值类型时,您有以下选择。

  1. 可以实现可空的平等解除。如果一个或两个操作数为null,则结果既不是true,也不是false,而是null。在这种情况下,你可以:

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

    • b)自动将null转换为false。这样做的缺点是,如果x为null,x==null将返回false,这会让人感到困惑,并且会影响人们对与引用类型进行空值比较的理解。

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

  3. 这些选择中没有一个显然是正确的;他们都有利有弊。例如,VBScript选择1b。经过多次辩论,C#设计团队选择了#2。

答案 1 :(得分:58)

因为Equality与Comparability分开定义 您可以测试x == null,但x > null毫无意义。在C#中,它总是错误的。

答案 2 :(得分:11)

另一种描述'> ='的方法是:不小于。没有提到平等。一旦非等式测试中的一个操作数为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   
 */   

答案 3 :(得分:2)

>=对数值进行操作; null不是。

您可以overload >=运算符提供您对特定类型的所需内容。

答案 4 :(得分:0)

NULL不为零(数字或二进制值),零长度字符串或空白(字符值)。 所以任何比较运算符总是会返回false。 Read more about it here

答案 5 :(得分:0)

您期望什么价值观?

null == null tr​​ue

null&gt; = null false

null&gt; null false

null&lt; = null false

null&lt; null false

null!= null false

1 == null false

1&gt; = null false

1&gt; null false

1&lt; = null false

1&lt; null false

1!= null tr​​ue aka!(1 == null)

答案 6 :(得分:0)

&gt; =仅在以特定明确定义的方式使用时表示“大于或等于”。当在具有重载运算符的类上使用时,它意味着类开发人员想要它的意思。当应用于类似字符串的类时,它可能意味着“排序相同或更高”,或者它可能意味着“相同长度或更长”。

答案 7 :(得分:0)

由于默认情况下int不能为null,并且其值将设置为0,因此,为int类型构建的>和<运算符应与{ {1}},而不是values

看到我对类似问题的回答,其中我写了一些使用nullsnullable int运算符https://stackoverflow.com/a/51507612/7003760来处理less <的方法