2013-04-03 7 views
70

Zaczynam uczyć się typów zerowych i popadłem w następujące zachowanie.W jaki sposób operator porównania działa z wartością null int?

Podczas próby zerowania int, widzę operator porównania daje mi nieoczekiwany wynik. Na przykład, W moim kodzie poniżej, wyjście, które otrzymuję, to "oba i 1 są równe". Uwaga, nie wyświetla również "null".

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

Miałem nadzieję dowolny nieujemna liczba całkowita będzie większa niż null, jestem brakuje czegoś tutaj?

+1

[Tutaj jest małe .NET Fiddle] (https://dotnetfiddle.net/NddZ9N), aby zobaczyć kilka przypadków. –

Odpowiedz

98

Według MSDN - to na dole strony w sekcji „podmioty”:

Podczas wykonywania porównań z pustych typów, jeżeli wartość jednej z pustych typów jest null a drugi nie jest, wszystkie porównania ocenić na false wyjątkiem !=

więc zarówno a > b i a < b ocenić na false od a jest null ...

+1

W moich projektach obecnie używam VB.NET i wydaje mi się, że 'nic <> 1' =' null' w VB podczas gdy 'null! = 1' =' true' w C# - Używam LinqPada do testowania instrukcji –

+1

Po prostu zastanawiałem się, i warto zwrócić uwagę na "Podnoszone Operatory" w C# https://stackoverflow.com/questions/3370110/what-are-lifted-operators - zastanawiałem się, czy to może być powód, dla którego VB.NET zwraca różne wyniki –

22

Jak MSDN mówi

Podczas wykonywania porównań z pustych typów, jeżeli wartość jednej z pustych typów jest zerowy, a drugi nie, wszystkich porównań FALSE wyjątkiem! = (nie równe). Ważne jest, aby nie przyjmować założyć, że ponieważ konkretne porównanie zwraca wartość false, to przeciwny przypadek zwraca wartość true. W poniższym przykładzie 10 nie jest większe niż, mniejsze niż ani równe zeru. Tylko num1! = Num2 jest prawdziwe.

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

Dzięki, to pomaga :) – Ron5504

9

Podsumowując: wszelkie porównania nierówność z wartością null (>=, <, <=, >) zwraca false nawet jeśli oba argumenty są nieważne. tj

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

Każda równość lub nie równość porównanie z puste (==, !=) działa „prawidłowo”. tj.

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