Zaczynam uczyć się typów dopuszczających wartość null i napotykam następujące zachowania.
Podczas próby zerowania int, widzę, że operator porównania daje nieoczekiwany wynik. Na przykład w moim kodzie poniżej otrzymane dane wyjściowe to „oba i 1 są równe” . Uwaga, nie wypisuje 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ę, że jakakolwiek nieujemna liczba całkowita będzie większa niż zero. Czy czegoś tu brakuje?
Odpowiedzi:
Według MSDN - na dole strony w sekcji „Operatorzy”:
Więc oba
a > b
ia < b
oceniaj,false
ponieważa
jest null ...źródło
nothing <> 1
=null
w VB, podczas gdynull != 1
=true
w C # - używam LinqPada do testowania instrukcjiLifted Operators
w C # 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 wynikiJak mówi MSDN
źródło
Podsumowując: wszelkie porównania nierówność z wartością null (
>=
,<
,<=
,>
) zwracafalse
nawet jeśli oba argumenty są nieważne. to znaczyKażde porównanie równości lub nierówności z null (
==
,!=
) działa „zgodnie z oczekiwaniami”. to znaczyźródło
int? nonNull
iint notNull
?Nullable<NumberTypes> = null
. Zweryfikowano.Porównanie C # z SQL
C #: a = null i b = null => a == b => true
SQL: a = null i b = null => a == b => false
źródło