Comparer deux structures en utilisant ==

J’essaie de comparer deux structures en utilisant des équations (==) en C #. Ma structure est ci-dessous:

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(); } } 

J’essaie d’avoir struct comme une propriété dans ma classe, et je veux vérifier pour voir si la structure est égale à la valeur que j’essaie de lui assigner, avant d’aller de l’avant, donc je n’indique pas la propriété a changé quand il n’a pas changé, comme ça:

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

Cependant, sur la ligne où je vérifie l’égalité, j’obtiens cette erreur:

L’opérateur ‘==’ ne peut pas être appliqué aux opérandes de type ‘CisSettings’ et ‘CisSettings’

Je n’arrive pas à comprendre pourquoi cela se produit, quelqu’un pourrait-il me diriger dans la bonne direction?

Vous devez surcharger les opérateurs == et != . Ajoutez ceci à votre 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); } 

Lorsque vous remplacez la méthode .Equals, l’opérateur == n’est pas automatiquement surchargé. Vous devez le faire explicitement.

Voir aussi Directives pour remplacer Equals () et Operator == .

Vous n’implémentez pas explicitement un opérateur d’égalité , donc == n’est pas défini en particulier pour le type.

Vous devez surcharger votre opérateur, comme ceci:

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

Vous devez écraser explicitement l’opérateur ==.

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

Au fait, vous feriez bien de mettre le code de comparaison en public bool Equals(CisSettings other) , et de laisser bool Equals(object obj) appeler bool Equals(CisSettings other) , afin de gagner en performance en évitant les vérifications de type inutiles.

vous devez surcharger l’opérateur “==”, mais aussi surcharger l’opérateur “! =”. ( Regardez cette note )

Pour l’opérateur de surcharge, voir cette page