我有两个int类型的变量? (或Nullable< int>如果你愿意的话)。我想对两个变量进行大于或等于(> =)的比较,但事实证明,如果两个变量都为空,则返回false,而显然==运算符返回true。
有人可以向我解释为什么这是合乎逻辑的,因为> =运算符的语义定义包含单词“or”?
答案 0 :(得分:95)
当该功能最初是在C#2.0中设计的时候,关于这种奇怪性的争论很激烈。问题是C#用户完全习惯这是有意义的:
if(someReference == null)
将等式扩展为可空值类型时,您有以下选择。
可以实现可空的平等解除。如果一个或两个操作数为null,则结果既不是true,也不是false,而是null。在这种情况下,你可以:
a)在if
语句中使nullable值类型相等是非法的,因为if
语句需要bool,而不是可空的bool。相反,如果他们想要与null进行比较,则要求每个人都使用HasValue
。这是冗长和恼人的。
b)自动将null转换为false。这样做的缺点是,如果x为null,x==null
将返回false,这会让人感到困惑,并且会影响人们对与引用类型进行空值比较的理解。
可以取消可空的平等。可为空的等式为true或false,与null的比较是空检查。这使得可空的等式与可空的不等式不一致。
这些选择中没有一个显然是正确的;他们都有利有弊。例如,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 true
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 true aka!(1 == null)
答案 6 :(得分:0)
&gt; =仅在以特定明确定义的方式使用时表示“大于或等于”。当在具有重载运算符的类上使用时,它意味着类开发人员想要它的意思。当应用于类似字符串的类时,它可能意味着“排序相同或更高”,或者它可能意味着“相同长度或更长”。
答案 7 :(得分:0)
由于默认情况下int
不能为null,并且其值将设置为0
,因此,为int
类型构建的>和<运算符应与{ {1}},而不是values
。
看到我对类似问题的回答,其中我写了一些使用nulls
和nullable int
运算符https://stackoverflow.com/a/51507612/7003760来处理less <
的方法