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?


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 ...


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
 */

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.