Wie funktioniert der Vergleichsoperator mit null int?

151

Ich fange an, nullbare Typen zu lernen und bin auf folgendes Verhalten gestoßen.

Beim Versuch, nullable int zu verwenden, sehe ich, dass der Vergleichsoperator ein unerwartetes Ergebnis liefert. In meinem Code unten lautet die Ausgabe beispielsweise "beide und 1 sind gleich" . Beachten Sie, dass auch nicht "null" ausgegeben wird.

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

Ich hatte gehofft, dass eine nicht negative ganze Zahl größer als null ist. Vermisse ich hier etwas?

Ron5504
quelle
5
Hier ist eine kleine .NET-Geige , um mehrere Fälle zu sehen.
Uwe Keim

Antworten:

207

Laut MSDN ist es unten auf der Seite im Abschnitt "Operatoren":

Wenn Sie Vergleiche mit nullbaren Typen durchführen und der Wert eines der nullbaren Typen nullder andere ist und der andere nicht, werden alle Vergleiche mit falseAusnahme von ausgewertet!=

Also beides a > bund a < bauswerten, falseda aist null ...

nkvu
quelle
2
In meinen Projekten verwende ich derzeit VB.NET und es scheint, dass nothing <> 1= nullin VB, während null != 1= truein C # - ich LinqPad verwendet habe, um die Anweisungen zu testen
Luke T O'Brien
2
Ich habe mich nur gefragt, und es ist erwähnenswert, Lifted Operatorsin C # stackoverflow.com/questions/3370110/what-are-lifted-operators - Ich habe mich gefragt, ob dies der Grund sein könnte, warum VB.NET andere Ergebnisse zurückgibt
Luke T O'Brien
44

Wie MSDN sagt

Wenn Sie Vergleiche mit nullbaren Typen durchführen und der Wert eines der nullbaren Typen null und der andere nicht ist, werden alle Vergleiche mit Ausnahme von! = (Nicht gleich) als falsch ausgewertet. Es ist wichtig, nicht anzunehmen, dass der umgekehrte Fall true zurückgibt, da ein bestimmter Vergleich false zurückgibt. Im folgenden Beispiel ist 10 nicht größer, kleiner oder gleich null. Nur num1! = Num2 ergibt 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
 */
Parimal Raj
quelle
25

Fassen wir zusammen: jede Ungleichheit Vergleich mit null ( >=, <, <=, >) liefert , falseselbst wenn beide Operanden null sind. dh

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

Jeder Vergleich von Gleichheit oder Nichtgleichheit mit null ( ==, !=) funktioniert 'wie erwartet'. dh

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true
GDS
quelle
Ist es für beide gleich int? nonNullund int notNull?
5ое Кто
1
@ КоеКто, das gleiche Verhalten ist für Nullable<NumberTypes> = null. Verifiziert.
Artru
2

C # mit SQL vergleichen

C #: a = null und b = null => a == b => true

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

Gunnar Siréus
quelle