比较运算符如何与null int一起使用?

Ron*_*504 129 c# nullable

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

在尝试nullable int时,我看到比较运算符给了我意想不到的结果.例如,在我的下面的代码中,我得到的输出是"两个和1相等".请注意,它也不会打印"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);
Run Code Online (Sandbox Code Playgroud)

我希望任何非负整数都大于null,我错过了什么吗?

小智 184

根据MSDN - 它位于"运营商"部分的页面下方:

当您使用可空类型进行比较时,如果其中一个可空类型的值是null,而另一个不是,则所有比较都将评估为false除外!=

因此,无论a > ba < b评估,以falsea为空...

  • 在我的项目中,我目前正在使用VB.NET,似乎在VB中"没有<> 1` =`null`而在C#中`null!= 1` =`true` - 我一直在使用LinqPad来测试语句 (2认同)
  • 我只是想知道,值得注意的是 C# 中的`Lifted Operators` /sf/ask/235907731/ - 我想知道这是否可能是 VB.NET 返回不同结果的原因 (2认同)

PaR*_*RaJ 38

正如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
 */
Run Code Online (Sandbox Code Playgroud)


GDS*_*GDS 23

总结:与空(任何不平等的比较>=,<,<=,>)返回false即使两个操作数都为空.即

null >  anyValue //false
null <= null     //false
Run Code Online (Sandbox Code Playgroud)

与null(==,!=)的任何相等或不相等比较都"按预期"工作.即

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true
Run Code Online (Sandbox Code Playgroud)


Gun*_*éus 6

C# 与 SQL 的比较

C#:a=null 和 b=null => a==b => true

SQL:a=null 和 b=null => a==b => false