2015-05-13 5 views
8

Im folgenden C# -Snippet überschreibe ich die ==-Methode. _type ist eine Nummer des Typs short. Also ich sage eigentlich, dass zwei WorkUnitType s gleich sind, wenn diese beiden short s gleich sind.Auf Null prüfen in == überschreiben

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

Weil R # warnt mich, und es ist völlig klar, warum, dass type1/type2 möglicherweise null sein könnte, ich versuche, über das mit der if Aussage zu fangen.

Jetzt bekomme ich eine StackOverflowException, die völlig Sinn macht, weil ich tatsächlich die Überschreibung aufrufen.

Frage: Wie schreibe ich diese Methode "richtig". Wie kann ich den Fall erfassen, dass type1 oder type2null sein können?

Meine beste Vermutung: Vielleicht bin ich nur == hier mißbrauchen und die Überprüfung auf Gleichheit sollte mit der Equals Überschreibung erfolgen. Aber ich denke immer noch, dass das Problem existiert. Wo ist mein Denkfehler?

Antwort

9

Sie suchen nach der ReferenceEquals()-Funktion, die direkt unter Umgehung Ihrer Bedienerüberlastung vergleichen wird.

+0

ich nicht wusste, dass 'ReferenceEquals' existiert. Das ist eigentlich die Antwort. Vielen Dank. – Stephan

2

Zusätzlich zu dem, was SLaks sagte, möchten Sie wahrscheinlich auch true zurückgeben, wenn beide gleich null sind. So, wie folgt aus:

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

Der Vollständigkeit halber: Sie können werfen auch die beiden Argumente object. Dies verwendet die Implementierung wie in object definiert und nicht Ihre benutzerdefinierte.

In Code:

if ((object) type1 == null || (object) type2 == null)