Heim >Backend-Entwicklung >C++ >Warum lässt C# Werttypvergleiche mit Null zu, obwohl diese immer als „Falsch' ausgewertet werden?
Unerwartetes Verhalten beim Nullvergleich des C#-Werttyps
In C# sind Werttypen wie Ganzzahlen und DateTime normalerweise nicht nullbar, was bedeutet, dass sie nicht null zugewiesen werden können. In einigen Fällen ermöglicht C# jedoch den Vergleich eines Werttyps mit Null, ohne dass ein Fehler ausgegeben wird.
Auflösung von Operatorüberladungen und nullfähige Typen
Einer der Gründe hat mit der Lösung von Bedienerüberlastungen zu tun. C# unterstützt das Überladen von Operatoren, sodass Entwickler benutzerdefinierte Operatoren für ihre Klassen definieren können. Für den Gleichheitsoperator (==) sind Operatoren für nullfähige Werttypen definiert.
Bedenken Sie den folgenden Codeausschnitt:
<code class="language-csharp">Int32 x = 1; if (x == null) { ... }</code>
Dieser Code wird kompiliert, weil der C#-Compiler die entsprechende Überladung des Gleichheitsoperators gefunden hat. Lokale int-Variablen sind implizit in nullfähige Ganzzahlen (int?) konvertierbar, und Nullliterale sind ebenfalls nullfähige Ganzzahlen. Daher kann der Operator == auf beide Nullable-Ganzzahlen angewendet werden.
Auch wenn der Ausdruck (x == null) immer als falsch ausgewertet wird, wird er als gültiger Vergleich betrachtet.
In nullbaren Typ konvertieren
Eine andere Situation ist, wenn Sie versuchen, einen Werttyp mit einer Nullobjektreferenz zu vergleichen. Zum Beispiel:
<code class="language-csharp">object o = null; if (x == o) { ... }</code>
In diesem Fall wird die int-Variable x in den Typ Objekt konvertiert, was einen Vergleich mit null ermöglicht. Das Ergebnis dieses Vergleichs ist jedoch immer falsch.
Nullbare Strukturen und bedingte Ausdrücke
Statische Mitglieder einer Struktur, wie z. B. DateTime.Now, können standardmäßig leer sein. Dies bedeutet, dass Sie sie mit Null vergleichen können, der Kontext muss jedoch berücksichtigt werden. In Ihrem Beispiel:
<code class="language-csharp">if (test.ADate == null) { ... }</code>
Der Ausdruck test.ADate ist nullable, da er Mitglied einer Struktur ist, auch wenn er nicht explizit als nullable deklariert ist. Ein Vergleich mit Null wird jedoch immer noch als konstanter Ausdruck betrachtet und ergibt daher immer „falsch“.
Zusammenfassend lässt sich sagen, dass C# dank der Auflösung von Operatorüberladungen und automatischen Konvertierungen den Vergleich von Werttypen mit Null ermöglicht. Es ist jedoch wichtig zu verstehen, dass das Ergebnis dieser Vergleiche immer falsch ist, da Werttypen nicht null zugewiesen werden können.
Das obige ist der detaillierte Inhalt vonWarum lässt C# Werttypvergleiche mit Null zu, obwohl diese immer als „Falsch' ausgewertet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!