23 Stimmen

Wie kann ich den Gleichheitsoperator == für eine Schnittstelle in C# außer Kraft setzen?

Ich habe die folgende Schnittstelle definiert:

public interface IHaveAProblem
{
    string Issue { get; set; }
}

Und hier ist die Implementierung von IHaveAProblem :

public class SomeProblem : IHaveAProblem
{
    public string Issue { get; set; }

    public override bool Equals(object obj)
    {
        SomeProblem otherObj = obj as SomeProblem;

        if (otherObj == null)
        {
            return false;
        }

        return this.Issue == otherObj.Issue;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public static bool operator ==(SomeProblem rhs, SomeProblem lhs)
    {
        // Null check
        if (Object.ReferenceEquals(rhs, null) || Object.ReferenceEquals(lhs, null))
        {
            if (Object.ReferenceEquals(rhs, null) && Object.ReferenceEquals(lhs, null))
            {
                // Both are null.  They do equal each other
                return true;
            }

            // Only 1 is null the other is not so they do not equal
            return false;
        }

        return rhs.Equals(lhs);
    }

    public static bool operator !=(SomeProblem rhs, SomeProblem lhs)
    {
        // Null check
        if (Object.ReferenceEquals(rhs, null) || Object.ReferenceEquals(lhs, null))
        {
            if (Object.ReferenceEquals(rhs, null) && Object.ReferenceEquals(lhs, null))
            {
                // Both are null.  They do equal each other
                return false;
            }

            // Only 1 is null the other is not so they do not equal
            return true;
        }

        return !rhs.Equals(lhs);
    }
}

Wenn ich das Objekt verwende, erhalte ich die richtigen Ergebnisse für die == vergleichen:

SomeProblem firstTest = new SomeProblem()
    {
        Issue = "Hello World"
    };

SomeProblem secondTest = new SomeProblem()
    {
        Issue = "Hello World"
    };

// This is true
bool result = firstTest == secondTest;

Wenn ich jedoch versuche, die Schnittstellen zu vergleichen, wird ein Speichervergleich durchgeführt, anstatt den Operator == auf SomeProblem :

IHaveAProblem firstProblem = new SomeProblem()
    {
        Issue = "Hello World"
    };

IHaveAProblem secondProblem = new SomeProblem()
    {
        Issue = "Hello World"
    };

Ist es möglich, dass die Schnittstelle die == auf SomeProblem als ein Speichervergleich?

Ich weiß, ich kann eine firstProblem.Equals(secondProblem) und erhalten die richtigen Ergebnisse. Ich bin jedoch dabei, einen Rahmen zu schaffen, von dem ich nicht weiß, wie er am Ende verwendet wird. Ich dachte == korrekt funktionieren würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X