Как работает оператор сравнения с нулевым int?

Я начинаю изучать типы с нулевым значением и сталкиваться с следующим поведением.

При попытке nullable int, я вижу, оператор сравнения дает мне неожиданный результат. Например, в моем коде ниже, вывод я get равен "и 1 равны" . Обратите внимание, что он также не печатает "нуль".

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

Я надеялся, что любое неотрицательное целое будет больше нуля, я что-то пропустил здесь?

Ответ 1

Согласно MSDN - вниз по странице в разделе "Операторы":

Когда вы выполняете сравнения с типами с возможностью NULL, если значение одного из типов с нулевым значением равно null, а другое - нет, все сравнения оцениваются с помощью false, за исключением !=

Итак, как a > b, так и a < b оцениваются до false, так как a имеет значение null...

Ответ 2

Как сообщает MSDN

Когда вы выполняете сравнения с типами NULL, если значение одного нулевых типов - null, а другой - нет, все сравнения оценивать значение false, за исключением if = (не равно). Важно не предположим, что, поскольку конкретное сравнение возвращает false, противоположный случай возвращает true. В следующем примере 10 не больше, меньше или равно нулю. Только 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
 */

Ответ 3

Подводя итог: любое сравнение неравенства с нулем (>=, <, <=, >) возвращает false, даже если оба операнда равны нулю. то есть.

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

Любое сравнение равенства или неравновесия с нулем (==, !=) работает как ожидалось. то есть.

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

Ответ 4

Сравнение С# с SQL

С#: a = null и b = null => a == b => true

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