2013-04-03 5 views
70

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

При попытке nullable int, я вижу, оператор сравнения дает мне неожиданный результат. Например, в моем коде ниже, вывод i 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

[Вот небольшой .NET-скрипт] (https://dotnetfiddle.net/NddZ9N), чтобы увидеть несколько случаев. –

ответ

98

По MSDN - это вниз странице, в разделе «Операторов»:

При выполнении сравнения с обнуляемыми типами, если значение одного из обнуляемых типов null, а другие нет, все сравнения вычисляться false кроме !=

Так как a > b и a < b вычисляться false поскольку a является недействительным ...

+1

В моих проектах я в настоящее время использую VB.NET, и кажется, что в VB 'ничего <> 1' =' null', тогда как 'null! = 1' =' true' в C# - я использовал LinqPad для проверки операторов –

+1

Мне просто интересно, и стоит упомянуть о «Поднятых операторах» на C# https://stackoverflow.com/questions/3370110/what-are-lifted-operators - я задавался вопросом, может ли это быть причиной того, что VB.NET возвращает разные результаты –

22

Как MSDN говорит

При выполнении сравнения с обнуляемыми типами, если значение одного из обнуляемых типов равно нуль, а другие нет, все сравнений оценки лжи, за исключением! = (не равный). Важно не предположить, что, поскольку конкретное сравнение возвращает 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 
*/ 
+1

Спасибо, Это помогает :) – Ron5504

9

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

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

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

null == null  //true 
null != null  //false 
null == nonNull //false 
null != nonNull //true 
Смежные вопросы