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

我有两个inttypes的variables? (或者Nullable <int>,如果你愿意的话)。 我想对两个variables进行大于或等于(> =)的比较,但事实certificate,如果两个variables均为空,则返回false,而显然==运算符返回true。

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

当这个function最初是在C#2.0中devise的时候,对这个奇怪的问题引发了巨大的争论。 问题是,C#用户完全习惯于这是有意义的:

 if(someReference == null) 

将等式扩展为可空值types时,您有以下select。

  1. 可空的平等是真正解除的 。 如果其中一个或两个操作数都为null,那么结果既不是真,也不是假,而是为空。 在这种情况下,您可以:

    • a)在if语句中设置可为空值的types相等是非法的,因为if语句需要一个bool而不是一个可为null的bool。 相反,要求每个人都使用HasValue如果他们想比较为null。 这是冗长而刺激的。

    • b)自动将null转换为false。 这个缺点是,如果x为null,那么x==null将返回false,这是令人困惑的,并且会影响人们对引用types的null比较的理解。

  2. 可空的平等不被解除。 可为空的平等是真或假,与null比较是空检查。 这使得可以为null的不等于可空的不等式。

这些select都不是显而易见的。 他们都有优点和缺点。 例如,VBScriptselect1b。 经过多次辩论,C#devise团队select了#2。

因为平等是与可比性分开定义的。
你可以testingx == null但是x > null是没有意义的。 在C#中它将永远是错误的。

描述'> ='的另一种方式是:不小于。 没有提到平等。 只要非平等testing中的一个操作数是Null,结果也是未知的(为空)。 但是,如果您想知道两个操作数是否为空,则Null == Null是一个合理的testing(应该导致为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 */ 

>=在数值上运行; 其中null不是。

你可以重载 >=运算符来提供你想要的特定types。

NULL不是零(数字或二进制值),零长度string或空白(字符值)。 所以任何比较运算符总是会返回false。 在这里阅读更多关于它

你会期待什么样的价值?

null == null tr​​ue

null> = null false

null> null false

null <= null false

null <null false

null!= null false

1 == null false

1> = null false

1> null false

1 <= null false

1 <null false

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

> =只有在以特定的明确定义的方式使用时才意味着“大于或等于”。 当用于具有重载操作符的类时,它意味着类开发者希望它的意思。 当应用于类似string的类时,可能意味着“sorting相同或更高”,也可能意味着“长度相同或更长”。

Interesting Posts