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

Koe*_*oen 78 c# comparison nullable operators

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

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

Eri*_*ert 96

当该功能最初是在C#2.0中设计时,对这种奇怪性进行了大量争论.问题是C#用户完全习惯这有意义:

if(someReference == null)
Run Code Online (Sandbox Code Playgroud)

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

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

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

    • b)自动将null转换为false.这样做的缺点是,x==null如果x为null,则返回false,这会让人感到困惑并且不利于人们对引用类型的空比较的理解.

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

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

  • @MCS:首先就是激发问题的方式.当<=为false时,==可以为true. (3认同)
  • @Brian:那么为什么允许运营商在可空类型上呢?如果他们总是抛出可空类型的空值,那么你也可以只在非可空类型上定义运算符,并让用户将转换插入到非可空,因为这是他们将要拥有的做消除异常. (3认同)

Hen*_*man 58

因为Equality是与可比性分开定义的.
你可以测试,x == nullx > null没有意义.在C#中,它总是错误的.

  • 是的,但运算符大于_or_等于.我看到了真值表,但我倾向于同意OP,> =更大_or_等于,如果null == null为真,则null> = null也应该为真.我想我们只是将其用于实现和用户方便,以保留== null检查. (3认同)
  • @David,请参阅Eric的回答,"这些选择中没有一个显然是正确的".但一般来说,当一个类型是Equatable但不是Comparable时,那么`> =`就没有定义. (2认同)

Nea*_*alB 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   
 */   
Run Code Online (Sandbox Code Playgroud)

  • @Conrad这只是说明了将编程语言(在本例中为C#)翻译成英语的问题.恕我直言,每当Nulls形成逻辑时,你需要**来处理三态结果(真,假,未知).任何涉及Null的表达式都应该导致未知,除了"Null == x"之外,它是对未知的显式测试,导致true或false. (3认同)