为什么当= ==返回空值为真时,> =返回false?
我有两个inttypes的variables? (或者Nullable <int>,如果你愿意的话)。 我想对两个variables进行大于或等于(> =)的比较,但事实certificate,如果两个variables均为空,则返回false,而显然==运算符返回true。
有人可以向我解释为什么这是合乎逻辑的,因为> =运算符的语义定义包含单词“或”?
当这个function最初是在C#2.0中devise的时候,对这个奇怪的问题引发了巨大的争论。 问题是,C#用户完全习惯于这是有意义的:
if(someReference == null)
将等式扩展为可空值types时,您有以下select。
-
可空的平等是真正解除的 。 如果其中一个或两个操作数都为null,那么结果既不是真,也不是假,而是为空。 在这种情况下,您可以:
-
a)在
if
语句中设置可为空值的types相等是非法的,因为if
语句需要一个bool而不是一个可为null的bool。 相反,要求每个人都使用HasValue
如果他们想比较为null。 这是冗长而刺激的。 -
b)自动将null转换为false。 这个缺点是,如果x为null,那么
x==null
将返回false,这是令人困惑的,并且会影响人们对引用types的null比较的理解。
-
-
可空的平等不被解除。 可为空的平等是真或假,与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 true
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 true aka!(1 == null)
> =只有在以特定的明确定义的方式使用时才意味着“大于或等于”。 当用于具有重载操作符的类时,它意味着类开发者希望它的意思。 当应用于类似string的类时,可能意味着“sorting相同或更高”,也可能意味着“长度相同或更长”。