我有两个类型为int的变量?(或者,如果可以,则为Nullable <int>)。我想对两个变量进行大于或等于(> =)比较,但事实证明,如果两个变量均为null,则返回false,而显然==运算符返回true。
有人可以向我解释为什么这很逻辑,因为> =运算符的语义定义包含单词“或”吗?
我有两个类型为int的变量?(或者,如果可以,则为Nullable <int>)。我想对两个变量进行大于或等于(> =)比较,但事实证明,如果两个变量均为null,则返回false,而显然==运算符返回true。
有人可以向我解释为什么这很逻辑,因为> =运算符的语义定义包含单词“或”吗?
int?
),则它们的值是已知的。 null
。
Null
),但是该变量所代表的实际问题域实体/值是不知道..
Answers:
当该功能最初是在C#2.0中设计的时,关于这种古怪性存在着巨大的争论。问题在于,C#用户已经完全习惯了这一点:
if(someReference == null)
将相等性扩展为可为空的值类型时,您可以选择以下内容。
真正的平等是可以消除的。如果一个或两个操作数为null,则结果既不是true,也不是false,而是null。在这种情况下,您可以:
a)在if
语句中具有可为空的值类型相等是非法的,因为该if
语句需要布尔值,而不是可为空的布尔值。相反,HasValue
如果每个人都想比较为null ,则要求所有人使用。这是冗长和令人讨厌的。
b)自动将null转换为false。这样做的缺点是,x==null
如果x为null,则返回false,这会造成混淆,并且不利于人们对引用类型的null比较的理解。
可提升的平等不会解除。可为空的相等性为true或false,与null的比较为null检查。这使得可为空的相等性与可为空的不等式不一致。
这些选择显然都不正确。他们都有优点和缺点。例如,VBScript选择1b。经过大量辩论,C#设计团队选择了第二名。
<
,<=
,=>
,或者>
当一个操作数为null
。在C#中,答案是return false
。在Scala / JavaString
类中,答案是抛出NullPointerException
。
因为平等是与可比性分开定义的。
您可以测试,x == null
但x > null
毫无意义。在C#中,它将始终为false。
>=
根本没有定义。
描述'> ='的另一种方式是:不小于。没有提及平等。一旦非相等测试中的操作数之一为Null,结果也将是未知的(为null)。但是,如果您想知道两个操作数是否均为Null,则Null == Null是一个合理的测试(应为true)。摆脱运营商的不平等部分,一切都是不同的。
来自http://msdn.microsoft.com/zh-cn/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 == x
是对未知的显式测试,结果为true或false。
>=
对数值进行运算;哪个不是。
您可以使运算符超载,>=
以提供所需的特定类型的内容。
Nullable<T>
的代码。
NULL不为零(数字或二进制值),长度为零的字符串或空白(字符值)。因此,任何比较运算符都将始终对其返回false。 在这里了解更多
null
。此外,C#可空类型的比较运算符是一种奇怪的野兽,不一定遵循用于空比较的常规规则。
由于默认情况下,aint
不能为null,其值将设置为0
,>和<的运算符是针对int
类型构建的,因此期望与values
或不与nulls
。
看到我对类似问题的回答,其中我写了一些nullable int
使用less <
和greater >
运算符处理的方法https://stackoverflow.com/a/51507612/7003760