J'essaie de comparer deux structures en utilisant des égaux (==) en C #. Ma structure est ci-dessous:
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();
}
}
J'essaie d'avoir struct en tant que propriété dans ma classe, et je veux vérifier si la structure est égale à la valeur à laquelle j'essaie de l'affecter, avant d'aller de l'avant et de le faire, donc je n'indique pas la propriété a changé quand il n'a pas changé, comme ceci:
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 m'orienter dans la bonne direction?
Vous devez surcharger le ==
et !=
les opérateurs. 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, le ==
L'opérateur n'est pas automatiquement surchargé. Vous devez le faire explicitement.
Voir aussi Lignes directrices pour remplacer Equals () et Operator == .
vous devez surcharger l'opérateur "==", mais aussi surcharger l'opérateur "! =". ( Regardez cette note )
Pour l'opérateur de surcharge, voir cette page
Vous n'avez pas implémentez explicitement un opérateur d'égalité , donc ==
n'est pas défini particulièrement pour le type.
Vous devriez surcharger votre opérateur est quelque chose comme ça:
public static bool operator ==(CisSettings a, CisSettings b)
{
return a.Equals(b);
}
Vous devez remplacer explicitement l'opérateur ==.
public static bool operator ==(CisSettings x, CisSettings y)
{
return x.Equals(y);
}
Soit dit en passant, vous feriez mieux de mettre le code de comparaison dans public bool Equals(CisSettings other)
, et de laisser bool Equals(object obj)
appeler bool Equals(CisSettings other)
, afin que vous puissiez gagner en performances en évitant les types inutiles vérifier.