Heim >Backend-Entwicklung >C++ >Warum lässt C# Werttypvergleiche mit Null zu, obwohl diese immer als „Falsch' ausgewertet werden?

Warum lässt C# Werttypvergleiche mit Null zu, obwohl diese immer als „Falsch' ausgewertet werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-16 18:30:10901Durchsuche

Why Does C# Allow Value Type Comparisons to Null, Even Though They Always Evaluate to False?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn