比较运算符如何处理空的整数?

211

我开始学习可空类型,并遇到以下行为。

当尝试使用可空整数时,我发现比较运算符给出了意外的结果。例如,在我的以下代码中,我得到的输出是"both and 1 are equal"。请注意,它也不打印出"null"。

int? a = null;
int? b = 1;

if (a < b)
    Console.WriteLine("{0} is bigger than {1}", b, a);
else if (a > b)
    Console.WriteLine("{0} is bigger than {1}", a, b);
else
    Console.WriteLine("both {0} and {1} are equal", a, b);

我原本希望任何非负整数都大于零,难道我漏掉了什么吗?


7
这是一个小的.NET Fiddle,可用于查看几种情况。 - Uwe Keim
1
@UweKeim,在这个fiddle中,第二个重载应该是void compare(int? a, int b),也就是说,第二个参数应该是非空的。 - Olivier Jacot-Descombes
5个回答

299
根据MSDN中的"Operators"部分,当对可空类型进行比较时,如果其中一个可空类型的值为null而另一个不是,则所有比较都会评估为false(除了!=)。因此,由于a为空,a > ba < b均评估为false

4
在我的项目中,我目前正在使用VB.NET。在此语言中,似乎 nothing <> 1 等同于 null ,而在C#中,null != 1 等同于 true。我一直在使用LinqPad来测试这些语句。 - Luke T O'Brien
2
我只是想知道,并且值得注意的是C#中的“Lifted Operators” https://dev59.com/WnA75IYBdhLWcg3wS3FA - 我想知道这是否可能是VB.NET返回不同结果的原因 - Luke T O'Brien

60

根据MSDN的说法:

当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不是,则所有比较都会评估为false,除了!=(不等于)。重要的是不要假设因为某个特定的比较返回false,相反的情况会返回true。在以下示例中,10不大于、不小于、也不等于null。只有num1 != num2评估为true。

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
 */

43

简而言之:与 null 进行任何不等比较(>=<<=>)即使两个操作数都为null,也会返回false

null >  anyValue //false
null <= null     //false

任何与null的等于或不等于比较(==!=)都按预期工作。即

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true

对于 int? nonNullint notNull,它们是一样的吗? - Кое Кто
1
@КоеКто,对于 Nullable<NumberTypes> = null 的情况,行为相同。已验证。 - Artur A

5

比较C#和SQL

C#: 当a=null且b=null时 => a==b => true

SQL: 当a=null且b=null时 => a==b => false


0
如果您在最后的else中编写了"else if(a == b)",则将不会获得任何输出。因为a既不大于1,也不小于1,也不等于1,它是null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接