Nullprüfung ist für eine Klasse mit mehreren Überschreibungen für == operator nicht eindeutig

8

Ich habe eine Klasse mit zwei Overrides für den Operator ==, um sie mit anderen Instanzen dieser Klasse zu vergleichen und mit der Instanz von string zu vergleichen.

%Vor%

Wenn ich jedoch versuche, diese Klasse mit null zu vergleichen:

%Vor%

Ich erhalte den folgenden Fehler:

%Vor%

Wie sollte ich meine == Überschreibungen definieren, damit ich Instanzen dieser Klasse immer noch auf Null überprüfen kann?

    
Max Yankov 05.08.2013, 17:43
quelle

4 Antworten

6

Da Sie ein null Literal verwenden, weiß der Compiler nicht, welche Methode aufgerufen werden soll, da sowohl string als auch SomeClass null sein können.

Eine Technik, die den Compiler zwingt, eine der Methoden auszuwählen, besteht darin, die Null zu schreiben.

%Vor%

Oder noch besser, anstatt null explizit zu verwenden, verwenden Sie das Schlüsselwort default , um den Nullwert zu erhalten (weil default(T) null ist, wenn T ein Referenztyp ist).

%Vor%     
voithos 05.08.2013, 17:48
quelle
4

Anstatt zwei Gleichheitsoperatoren zu definieren, können Sie eine implizite Konvertierung zwischen string und SomeClass erstellen:

%Vor%

Wenn Sie nun den Wert mit Null vergleichen, gibt es kein Mehrdeutigkeitsproblem.

Dies hat auch den Nebeneffekt, dass die Klassen überall implizit konvertierbar gemacht werden, aber basierend auf dem Kontext, der nicht schlecht zu sein scheint.

    
Servy 05.08.2013 17:52
quelle
1

Für diejenigen, die zu spät kommen, bitte unten für die akzeptablere Antwort, die sich in Kommentaren von @Jeppe Stig Nielsen versteckt.

Der Operator hat ausdrücklich gefragt, ob er den Operator überschreiben soll ==, aber ich glaube, dass dies eine wichtige Information beim Überschreiben des ==-Operators ist und die richtige Antwort für die zukünftige Referenz sein sollte: -

%Vor%

Wenn Sie die akzeptierte Antwort verwenden und sowohl == als auch Equals in Ihrem Objekt implementieren, erhalten Sie weiterhin denselben Fehler. Am besten vergleichen Sie mit null auf dem niedrigsten Level-Objekt, auf diese Weise vergleichen Sie "Objekt" mit null und alle Mehrdeutigkeit wird aus dem Vergleich entfernt.

Hier ist der Grund und die Auflösung, wie in MSDN implementiert: Richtlinien zum Überschreiben von Equals () und Operator = =

Betrachten Sie Folgendes, verweisen Sie auf die Kommentare in der Equals-Implementierung: -

%Vor%     
Mark 19.12.2015 05:32
quelle
-1

Sie können den zweiten Parameter als "Objekt" übergeben und dessen Typ prüfen, bevor Sie entscheiden, welche Gleichheit zu machen ist.

%Vor%     
Konstantin 05.08.2013 17:54
quelle