• How does comparison operator works with null int?


    How does comparison operator works with null int?

    问题

    I am starting to learn nullable types and ran into following behavior.

    While trying nullable int, i see comparison operator gives me unexpected result. For example, In my code below, The output i get is "both and 1 are equal". Note, it does not print "null" as well.

    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);

    I was hoping any non-negative integer would be greater than null, Am i missing something here?

    回答1

    According to MSDN - it's down the page in the "Operators" section:

    When you perform comparisons with nullable types, if the value of one of the nullable types is null and the other is not, all comparisons evaluate to false except for !=

    So both a > b and a < b evaluate to false since a is null...

    回答2

    As MSDN says

    When you perform comparisons with nullable types, if the value of one of the nullable types is null and the other is not, all comparisons evaluate to false except for != (not equal). It is important not to assume that because a particular comparison returns false, the opposite case returns true. In the following example, 10 is not greater than, less than, nor equal to null. Only num1 != num2 evaluates to 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
     */

     回答3

    To summarise: any inequality comparison with null (>=, <, <=, >) returns false even if both operands are null. i.e.

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

    Any equality or non-equality comparison with null (==, !=) works 'as expected'. i.e.

    null == null     //true
    null != null     //false
    null == nonNull  //false
    null != nonNull  //true
  • 相关阅读:
    常用HTTP Contenttype头信息及文件类型对照
    Web开发专用IDE:Aptana Studio 3.0
    如果张柏芝的孩子长大
    Apache日志分析工具Awstats的安装和配置
    台北貢寮~三貂角燈塔
    [转]ASP,PHP,JSP,ASP.NET 比较
    联想 Thinkpad SL410使用体验
    2011年6月TIOBE编程语言走势图及指数
    百度搜索能力越来越差了,看下图
    PHP 5.3.x中弃用的特性 Deprecated
  • 原文地址:https://www.cnblogs.com/chucklu/p/16355719.html
Copyright © 2020-2023  润新知