Das Problem, das hier beobachtet wird, ist ein Sonderfall eines allgemeineren Problems, nämlich dass die Anzahl der verschiedenen Definitionen der Gleichheit, die zumindest unter bestimmten Umständen nützlich sein können, die Anzahl der allgemein verfügbaren Mittel übersteigt, um sie auszudrücken. Dieses Problem wird in einigen Fällen durch die unglückliche Annahme verschlimmert, dass es verwirrend ist, unterschiedliche Mittel zum Testen der Gleichheit zu verwenden, um unterschiedliche Ergebnisse zu erzielen, und eine solche Verwirrung könnte vermieden werden, indem die verschiedenen Formen der Gleichheit nach Möglichkeit dieselben Ergebnisse liefern.
In der Realität ist die fundamentale Ursache für Verwirrung eine fehlgeleitete Annahme, dass die verschiedenen Formen der Gleichheits- und Ungleichheitsprüfung das gleiche Ergebnis liefern sollten, ungeachtet der Tatsache, dass unterschiedliche Semantiken unter verschiedenen Umständen nützlich sind. Aus arithmetischer Sicht ist es beispielsweise nützlich, solche zu haben, Decimal
die sich nur in der Anzahl der nachfolgenden Nullen unterscheiden, die als gleich verglichen werden. Ebenso für double
Werte wie positive Null und negative Null. Andererseits kann eine solche Semantik vom Caching- oder Internierungsstandpunkt aus tödlich sein. Nehmen wir zum Beispiel an, man hätte eine Dictionary<Decimal, String>
solche, myDict[someDecimal]
die gleich sein sollte someDecimal.ToString()
. Ein solches Objekt würde vernünftig erscheinen, wenn man viele hätteDecimal
Werte, die man in einen String konvertieren wollte und erwartete, dass es viele Duplikate geben würde. Wenn ein solches Caching zum Konvertieren von 12,3 m und 12,40 m gefolgt von 12,30 m und 12,4 m verwendet würde, würden die letzteren Werte leider "12,3" und "12,40" anstelle von "12,30" und "12,4" ergeben.
Zurück zur Sache: Es gibt mehr als eine sinnvolle Möglichkeit, nullbare Objekte auf Gleichheit zu vergleichen. C # vertritt den Standpunkt, dass sein ==
Operator das Verhalten von widerspiegeln sollte Equals
. VB.NET vertritt den Standpunkt, dass sein Verhalten das einiger anderer Sprachen widerspiegeln sollte, da jeder, der das Equals
Verhalten wünscht, es verwenden könnte Equals
. In gewissem Sinne wäre die richtige Lösung, ein Drei-Wege-"Wenn" -Konstrukt zu haben und zu verlangen, dass der Code angeben muss, was in dem null
Fall geschehen soll, wenn der bedingte Ausdruck ein dreiwertiges Ergebnis zurückgibt . Da dies bei Sprachen, wie sie sind, keine Option ist, besteht die nächstbeste Alternative darin, einfach zu lernen, wie verschiedene Sprachen funktionieren, und zu erkennen, dass sie nicht gleich sind.
Im Übrigen kann der in C fehlende Operator "Is" von Visual Basic verwendet werden, um zu testen, ob ein nullbares Objekt tatsächlich null ist. Während man sich vernünftigerweise fragen könnte, ob ein if
Test a akzeptieren sollte, ist es eine nützliche Funktion Boolean?
, wenn die normalen Vergleichsoperatoren zurückkehren, Boolean?
anstatt Boolean
wenn sie für nullfähige Typen aufgerufen werden. Übrigens, wenn man in VB.NET versucht, den Gleichheitsoperator anstelle von zu verwenden Is
, erhält man eine Warnung, dass das Ergebnis des Vergleichs immer sein wird Nothing
, und man sollte verwenden, Is
wenn man testen möchte, ob etwas null ist.