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