Why does >= return false when == returns true for null values?

前端 未结 8 2032
遥遥无期
遥遥无期 2020-12-07 18:17

I have two variables of type int? (or Nullable if you will). I wanted to do a greater-than-or-equal (>=) comparison on the two variables but as it turns out, this

相关标签:
8条回答
  • 2020-12-07 18:42

    What values would you expect?

    null == null true

    null >= null false

    null > null false

    null <= null false

    null < null false

    null != null false

    1 == null false

    1 >= null false

    1 > null false

    1 <= null false

    1 < null false

    1 != null true aka !(1 == null)

    0 讨论(0)
  • 2020-12-07 18:44

    >= only means "greater than or equal" when used in that specific well defined way. When used on a class with overloaded operators it means anything the class developer wants it to mean. When applied to a string-like class, it might mean "sorts the same or higher" or it might mean "the same length or longer".

    0 讨论(0)
  • 2020-12-07 18:50

    There was a huge debate about this oddity when the feature was originally designed back in C# 2.0. The problem is that C# users are completely used to this being meaningful:

    if(someReference == null)
    

    When extending equality to nullable value types, you have the following choices.

    1. Nullable equality is truly lifted. If one or both of the operands is null then the result is neither true, nor false, but null. In this case you can either:

      • a) Make it illegal to have a nullable value type equality in an if statement, because the if statement needs a bool, not a nullable bool. Instead, require everyone to use HasValue if they want to compare to null. This is verbose and irritating.

      • b) Automatically convert null to false. The downside of this is that x==null returns false if x is null, which is confusing and works against people's understanding of null comparisons with reference types.

    2. Nullable equality is not lifted. Nullable equality is either true or false, and comparison to null is a null check. This makes nullable equality inconsistent with nullable inequality.

    None of these choices is obviously correct; they all have pros and cons. VBScript chooses 1b, for example. After much debate the C# design team chose #2.

    0 讨论(0)
  • 2020-12-07 18:56

    Because Equality is defined separately from Comparability.
    You can test x == null but x > null is meaningless. In C# it will always be false.

    0 讨论(0)
  • 2020-12-07 18:59

    Another way of describing '>=' is: Not Less Than. No mention of equals. As soon as one of the operands in a non-equality test is Null, the result is unknown as well (is null). However if you want to know if both operands are Null, then Null == Null is a reasonable test (should result in true). Getting rid of the inequality part of the operator makes all the difference.

    The following code example from http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4 summarizes how C# treats 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   
     */   
    
    0 讨论(0)
  • 2020-12-07 18:59

    >= operates on a numeric value; which null is not.

    You could overload the >= operator to provide what you desire on a specific type.

    0 讨论(0)
提交回复
热议问题