【问题标题】:How does comparison operator works with null int?比较运算符如何与 null int 一起使用?
【发布时间】:2013-04-03 02:14:19
【问题描述】:

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

在尝试 nullable int 时,我看到比较运算符给了我意想不到的结果。例如,在我下面的代码中,我得到的输出是 "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);

我希望任何非负整数都大于 null,我在这里遗漏了什么吗?

【问题讨论】:

标签: c# nullable


【解决方案1】:

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

当您对可空类型执行比较时,如果可空类型之一的值为 null 而另一个不是,则所有比较的结果都为 false!= 除外

所以a &gt; ba &lt; b 都评估为false,因为a 为空...

【讨论】:

  • 在我的项目中,我目前正在使用 VB.NET,在 VB 中似乎 nothing &lt;&gt; 1 = null 而在 C# 中 null != 1 = true - 我一直在使用 LinqPad 来测试陈述
  • 我只是想知道,值得注意的是 C# 中的 Lifted Operators stackoverflow.com/questions/3370110/what-are-lifted-operators - 我想知道这是否可能是 VB.NET 返回不同结果的原因
【解决方案2】:

正如 MSDN 所说

当您执行与可为空类型的比较时,如果值一 可空类型中的一个是 null 而另一个不是,所有比较 评估为假,除了 != (不等于)。重要的是不要 假设因为一个特定的比较返回假, 相反的情况返回真。在以下示例中,10 不是 大于、小于或不等于 null。只有 num1 != num2 计算结果为真。

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】:

    总结一下:任何与 null 的不等式比较(&gt;=&lt;&lt;=&gt;)都会返回 false,即使两个操作数都是 null。即

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

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

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

    【讨论】:

    • int? nonNullint notNull 是否相同?
    • @КоеКто,Nullable&lt;NumberTypes&gt; = null 的行为相同。已验证。
    【解决方案4】:

    比较 C# 与 SQL

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 2011-12-24
      • 2016-06-28
      • 2012-06-06
      • 2019-04-21
      • 2023-04-03
      • 2014-02-16
      • 2018-12-23
      • 2020-11-10
      相关资源
      最近更新 更多