web-dev-qa-db-fra.com

Comparaison de deux structures en utilisant ==

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?

46
JMK

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);
}
77
Jens Kloster

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 == .

4
Hans Kesting

vous devez surcharger l'opérateur "==", mais aussi surcharger l'opérateur "! =". ( Regardez cette note )

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

1
Xaruth

Vous n'avez pas implémentez explicitement un opérateur d'égalité , donc == n'est pas défini particulièrement pour le type.

1
Grant Thomas

Vous devriez surcharger votre opérateur est quelque chose comme ça:

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

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.

1
Chen