2013-03-04 7 views
38

Ich versuche, zwei Strukturen mit Gleichheitszeichen (==) in C# zu vergleichen. Meine Struktur ist unten:Vergleichen von zwei Strukturen mit ==

public struct CisSettings : IEquatable<CisSettings> 
{ 
    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 Struktur als eine Eigenschaft in meiner Klasse zu haben, und will zu sehen, zu überprüfen, ob die Struktur auf den Wert gleich Ich versuche, es zu zuweisen, bevor ich gehe sie voran und tun so, so dass ich die Eigenschaft nicht geändert hat angibt, wenn es nicht, wie so hat:

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

jedoch auf der Linie, wo ich für die Gleichstellung zu überprüfen, ich diesen Fehler:

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

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

+0

Wie wäre es mit 'Equals()'? –

+0

Equals funktioniert gut, nur wundern, warum meine Überschreibung von == funktioniert nicht – JMK

+3

@JMK, vielleicht weil Sie es nicht außer Kraft gesetzt ... :) – gdoron

Antwort

63

Sie müssen die Operatoren == und != überladen. Fügen Sie diese auf Ihre struct:

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

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

Ich bin ein Idiot Du warst zuerst, also bekommst du die beste Antwort! – JMK

+0

thx - Sie waren fast da. –

+2

@JMK, Eigentlich war ich der erste, aber ich bin cool damit. :) – gdoron

1

Sie sollten Ihre Betreiber Überlastung ist eine Möglichkeit, wie folgt aus:

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

Sie müssen Betreiber außer Kraft setzen == explizit.

public static bool operator ==(CisSettings x, CisSettings y) 
{ 
    return x.Equals(y); 
} 

By the way, sollten Sie besser den Vergleich Code in public bool Equals(CisSettings other), setzen und bool Equals(object obj) Anruf bool Equals(CisSettings other), lassen Sie so, dass Sie durch die Vermeidung unnötiger Typprüfung eine Leistung zu gewinnen.