Почему> = возвращает false, когда == возвращает true для нулевых значений? - PullRequest
77 голосов
/ 09 декабря 2010

У меня есть две переменные типа int?(или Nullable , если хотите).Я хотел сделать сравнение больше чем или равно (> =) для двух переменных, но, как оказалось, он возвращает false, если обе переменные равны нулю, тогда как, очевидно, оператор == возвращает true.Может ли кто-нибудь объяснить мне, почему это логично, потому что семантическое определение оператора> = содержит слово «или»?

Ответы [ 8 ]

95 голосов
/ 09 декабря 2010

Было много споров об этой странности, когда эта функция была первоначально разработана еще в C # 2.0. Проблема в том, что пользователи C # полностью привыкли к этому значению:

if(someReference == null)

При расширении равенства для типов значений, допускающих значение NULL, у вас есть следующие варианты:

  1. Обнуляемое равенство действительно отменено . Если один или оба операнда имеют значение null, то результатом является ни true, ни false, а null. В этом случае вы можете:

    • a) Сделать недопустимым равенство типов значений, допускающих значение NULL, в операторе if, поскольку для оператора if требуется тип bool, а не nullable Вместо этого потребуйте, чтобы все использовали HasValue, если они хотят сравнить с нулем. Это многословно и раздражает.

    • б) Автоматически конвертировать ноль в ложь. Недостатком этого является то, что x==null возвращает false, если x равно нулю, что сбивает с толку и противоречит пониманию людьми нулевых сравнений со ссылочными типами.

  2. Обнуляемое равенство не отменяется. Обнуляемое равенство может быть истинным или ложным, а сравнение с нулем - пустой проверкой Это делает равноправное равенство несовместимым с равносильным неравенством.

Ни один из этих выборов, очевидно, не является правильным; у них всех есть плюсы и минусы. Например, VBScript выбирает 1b. После долгих дебатов команда разработчиков C # выбрала # 2.

58 голосов
/ 09 декабря 2010

Поскольку равенство определяется отдельно от сопоставимости.
Вы можете проверить x == null, но x > null не имеет смысла.В C # это всегда будет ложным.

11 голосов
/ 09 декабря 2010

Другой способ описания '> =': Не меньше, чем. Нет упоминания о равных. Как только один из операндов в тесте на равенство равен Null, результат также неизвестен (равен нулю). Однако, если вы хотите узнать, имеют ли оба операнда значение Null, тогда Null == Null - это приемлемый тест (должен привести к true) Избавление от неравенства часть оператора имеет все значение.

В следующем примере кода из http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4 суммируется, как C # обрабатывает 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   
 */   
2 голосов
/ 09 декабря 2010

>= работает с числовым значением; который ноль не является.

Вы можете перегрузить оператор >=, чтобы предоставить то, что вы хотите для определенного типа.

0 голосов
/ 25 июля 2018

Поскольку по умолчанию int не может быть нулевым, а его значение будет установлено на 0, оператор> и <, который построен для типа <code>int, ожидает работать с values, а не с nulls.

см. Мой ответ на аналогичный вопрос, где я написал несколько способов обработки nullable int с помощью операторов less < и greater > https://stackoverflow.com/a/51507612/7003760

0 голосов
/ 10 декабря 2010

> = означает «больше или равно» только в том случае, если оно используется определенным, хорошо определенным образом.При использовании в классе с перегруженными операторами это означает, что разработчик класса хочет, чтобы это значило.Применительно к строковому классу это может означать «сортирует одинаково или выше» или «одинаковой длины или длиннее».

0 голосов
/ 09 декабря 2010

Какие значения вы ожидаете?

null == null true

null> = null false

null> null false

null <=null false </p>

null

null! = null false

1 == null false

1> = null false

1> null false

1 <= null false </p>

1

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

0 голосов
/ 09 декабря 2010

NULL не является нулем (числовое или двоичное значение), строкой нулевой длины или пустым (символьное значение). Таким образом, любой оператор сравнения всегда возвращает false. Подробнее об этом здесь

...