Ich habe zwei Variablen vom Typ int? (oder Nullable <int>, wenn Sie so wollen). Ich wollte einen Vergleich größer als oder gleich (> =) für die beiden Variablen durchführen, aber wie sich herausstellt, gibt dies false zurück, wenn beide Variablen null sind, während der Operator == offensichtlich true zurückgibt.
Kann mir jemand erklären, warum das logisch ist, weil die semantische Definition des Operators> = das Wort "oder" enthält?
c#
comparison
operators
nullable
Koen
quelle
quelle
int?
), dann ihr Wert ist bekannt.null
.Null
), aber die reale Problemdomänenentität / der Wert, den die Variable darstellen soll, ist Nicht bekannt ..Antworten:
Es gab eine große Debatte über diese Kuriosität, als das Feature ursprünglich in C # 2.0 entwickelt wurde. Das Problem ist, dass C # -Benutzer daran gewöhnt sind, dass dies sinnvoll ist:
if(someReference == null)
Wenn Sie die Gleichheit auf nullbare Werttypen erweitern, haben Sie folgende Möglichkeiten.
Die nullbare Gleichheit wird wirklich aufgehoben . Wenn einer oder beide Operanden null sind, ist das Ergebnis weder wahr noch falsch, sondern null. In diesem Fall können Sie entweder:
a) Machen Sie es illegal, in einer
if
Anweisung eine Gleichheit vom Typ nullbarer Werte zu haben , da dieif
Anweisung einen Bool benötigt, keinen nullbaren Bool. Fordern Sie stattdessen alle zur Verwendung auf,HasValue
wenn sie mit null vergleichen möchten. Das ist ausführlich und irritierend.b) Konvertieren Sie automatisch null in false. Der Nachteil dabei ist, dass
x==null
false zurückgegeben wird, wenn x null ist. Dies ist verwirrend und wirkt dem Verständnis der Benutzer von Nullvergleichen mit Referenztypen entgegen.Die nullbare Gleichheit wird nicht aufgehoben. Die nullbare Gleichheit ist entweder wahr oder falsch, und der Vergleich mit null ist eine Nullprüfung. Dies macht die nullbare Gleichheit mit der nullbaren Ungleichung unvereinbar.
Keine dieser Entscheidungen ist offensichtlich richtig; Sie alle haben Vor- und Nachteile. VBScript wählt zum Beispiel 1b. Nach langen Diskussionen entschied sich das C # -Design-Team für # 2.
quelle
<
,<=
,=>
, oder>
wenn einer der Operanden istnull
. In C # lautet die Antwort returnfalse
. In der Scala / Java-String
Klasse lautet die Antwort: a werfenNullPointerException
.Weil Gleichheit getrennt von Vergleichbarkeit definiert wird.
Sie können testen
x == null
,x > null
ist aber bedeutungslos. In C # wird es immer falsch sein.quelle
>=
wird er im Allgemeinen einfach nicht definiert.Eine andere Art, '> =' zu beschreiben, ist: Nicht weniger als. Keine Erwähnung von Gleichen. Sobald einer der Operanden in einem Nichtgleichheitstest Null ist, ist das Ergebnis ebenfalls unbekannt (ist Null). Wenn Sie jedoch wissen möchten, ob beide Operanden Null sind, ist Null == Null ein vernünftiger Test (sollte zu true führen). Die Beseitigung des Ungleichheitsteils des Operators macht den Unterschied.
Das folgende Codebeispiel von http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4 fasst zusammen, wie C # Null behandelt:
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 */
quelle
Null == x
dass es sich um einen expliziten Test für unbekannt handelt, der entweder wahr oder falsch ist.>=
arbeitet mit einem numerischen Wert; welche null ist nicht.Sie können den Operator überladen
>=
, um das zu liefern, was Sie für einen bestimmten Typ wünschen.quelle
Nullable<T>
den Code.NULL ist nicht Null (numerischer oder binärer Wert), eine Zeichenfolge mit der Länge Null oder leer (Zeichenwert). Jeder Vergleichsoperator gibt also immer false zurück. Lesen Sie hier mehr darüber
quelle
null
. Darüber hinaus sind Vergleichsoperatoren für C # -Nullwerttypen ein seltsames Tier, das nicht unbedingt den üblichen Regeln für Nullvergleiche folgt.Welche Werte würden Sie erwarten?
null == null true
null> = null false
null> null false
null <= null false
null <null false
null! = null false
1 == null false
1> = null false
1> null false
1 <= null false
1 <null false
1! = Null true aka! (1 == null)
quelle
> = bedeutet nur "größer oder gleich", wenn es auf diese genau definierte Weise verwendet wird. Bei Verwendung in einer Klasse mit überladenen Operatoren bedeutet dies alles, was der Klassenentwickler möchte. Wenn es auf eine stringähnliche Klasse angewendet wird, bedeutet dies möglicherweise "gleich oder höher sortieren" oder "gleich lang oder länger".
quelle
Da ein standardmäßig
int
nicht null sein kann und sein Wert auf gesetzt0
wirdint
, erwartet der Operator von> und <, der für den Typ erstellt wurde, dass er mitvalues
und nicht mit arbeitetnulls
.siehe meine Antwort auf eine ähnliche Frage , wo ich schrieb einige Möglichkeiten , um Griff
nullable int
mit denless <
undgreater >
Betreibern https://stackoverflow.com/a/51507612/7003760quelle