Partager via


CA2231 : Surchargez l'opérateur égal (equals) en remplaçant ValueType.Equals

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Catégorie

Microsoft.Usage

Modification avec rupture

Modification sans rupture

Cause

Un type valeur se substitue à Object.Equals mais n'implémente pas l'opérateur d'égalité.

Description de la règle

La plupart des langages de programmation n'ont aucune implémentation par défaut de l'opérateur d'égalité (==) pour les types valeur. Si votre langage de programmation prend en charge des surcharges d'opérateur, vous devez envisager d'implémenter l'opérateur d'égalité. Son comportement doit être identique à celui de Equals.

Vous ne pouvez pas utiliser l'opérateur d'égalité par défaut dans une implémentation surchargée de l'opérateur d'égalité. Ce procédé provoque un dépassement de capacité de la pile. Pour implémenter l'opérateur d'égalité, utilisez la méthode Object.Equals dans votre implémentation. Par exemple :

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

Comment corriger les violations

Pour corriger une violation de cette règle, implémentez l'opérateur d'égalité.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle ; toutefois, nous vous recommandons, si possible, de fournir l'opérateur d'égalité.

Exemple

L'exemple suivant définit un type qui enfreint cette règle.

using System;

namespace UsageLibrary
{
    public struct PointWithoutHash
    {
        private int x,y;

        public PointWithoutHash(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public override string ToString()
        {
            return String.Format("({0},{1})",x,y);
        }

        public int X {get {return x;}}

        public int Y {get {return x;}}

        // Violates rule: OverrideGetHashCodeOnOverridingEquals.
        // Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals.
        public override bool Equals (object obj)
        {
            if (obj.GetType() != typeof(PointWithoutHash))
                return false;

            PointWithoutHash p = (PointWithoutHash)obj;   
            return ((this.x == p.x) && (this.y == p.y));
        }

    }

}

Règles connexes

CA1046 : Ne pas surcharger l'opérateur égal à sur les types référence

CA2225 : Les surcharges d'opérateur offrent d'autres méthodes nommées

CA2226 : Les opérateurs doivent contenir des surcharges symétriques

CA2224 : Remplacez Equals au moment de surcharger l'opérateur égal

CA2218 : Remplacez GetHashCode au moment de remplacer Equals

Voir aussi

Référence

Object.Equals