77 Stimmen

Vergleich von zwei Strukturen mit ==

Ich versuche, zwei Strukturen in C# mit dem Operator equals (==) zu vergleichen. Meine Struktur sieht so aus:

public struct CisSettings : IEquatable
{
    public int Gain { get; private set; }
    public int Offset { get; private set; }
    public int Bright { get; private set; }
    public int Contrast { get; private set; }

    public CisSettings(int gain, int offset, int bright, int contrast) : this()
    {
        Gain = gain;
        Offset = offset;
        Bright = bright;
        Contrast = contrast;
    }

    public bool Equals(CisSettings other)
    {
        return Equals(other, this);
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        var objectToCompareWith = (CisSettings) obj;

        return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast &&
               objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset;

    }

    public override int GetHashCode()
    {
        var calculation = Gain + Offset + Bright + Contrast;
        return calculation.GetHashCode();
    }
}

Ich versuche, die Struktur als Eigenschaft in meiner Klasse zu haben und möchte überprüfen, ob die Struktur gleich dem Wert ist, dem ich sie zuweisen möchte, bevor ich dies tue, damit ich nicht angebe, dass sich die Eigenschaft geändert hat, wenn dies nicht der Fall ist, wie folgt:

public CisSettings TopCisSettings
{
    get { return _topCisSettings; }
    set
    {
        if (_topCisSettings == value)
        {
            return;
        }
        _topCisSettings = value;
        OnPropertyChanged("TopCisSettings");
    }
}

Auf der Zeile, wo ich die Gleichheit prüfe, erhalte ich diesen Fehler:

Operator '==' cannot be applied to operands of type 'CisSettings' and 'CisSettings'

Ich kann nicht herausfinden, warum das passiert, könnte mir jemand in die richtige Richtung weisen?

118voto

Jens Kloster Punkte 10767

Sie müssen die == und != Operatoren überladen. Fügen Sie dies zu Ihrer struct hinzu:

public static bool operator ==(CisSettings c1, CisSettings c2) 
{
    return c1.Equals(c2);
}

public static bool operator !=(CisSettings c1, CisSettings c2) 
{
   return !c1.Equals(c2);
}

10voto

Hans Kesting Punkte 35936

Wenn Sie die Methode .Equals() überschreiben, wird der Operator == nicht automatisch überladen. Das müssen Sie explizit tun.

Siehe auch Richtlinien für das Überschreiben von Equals() und Operator == oder CA1815: Override equals and operator equals on value types.

3voto

Bijan Punkte 96

Sie können auch Record-Typen seit C# v9 und [record struct] Werttypen seit C# v10 verwenden, um das Schreiben einer enormen Menge an wiederholtem Code ohne jeglichen Zweck zu vermeiden

Weitere Details finden Sie in den Microsoft-Dokumenten hier:

Gleichheitsoperatoren (C#-Referenz)

In C# 9.0 und später unterstützen Record-Typen die == und != Operatoren, die standardmäßig Wertgleichheitssemantik bieten. Das bedeutet, dass zwei Record-Operatoren gleich sind, wenn beide null sind oder die entsprechenden Werte aller Felder und automatisch implementierten Eigenschaften übereinstimmen.

public class RecordTypesEquality
{
    public record Point(int X, int Y, string Name);
    public record TaggedNumber(int Number, List Tags);

    public static void Main()
    {
        var p1 = new Point(2, 3, "A");
        var p2 = new Point(1, 3, "B");
        var p3 = new Point(2, 3, "A");

        Console.WriteLine(p1 == p2);  // Ausgabe: False
        Console.WriteLine(p1 == p3);  // Ausgabe: True

        var n1 = new TaggedNumber(2, new List() { "A" });
        var n2 = new TaggedNumber(2, new List() { "A" });
        Console.WriteLine(n1 == n2);  // Ausgabe: False
    }
}

2voto

Grant Thomas Punkte 43318

Sie implementieren nicht explizit den Gleichheitsoperator, so dass == nicht speziell für diesen Typ definiert ist.

2voto

Denys Denysenko Punkte 7518

Sie sollten Ihren Operator in irgendeiner Weise überladen, wie z.B.:

public static bool operator ==(CisSettings a, CisSettings b)
{
    return a.Equals(b);
}

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