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

Propriété Value
Identificateur de la règle CA2224
Titre Remplacer Equals au moment de surcharger l’opérateur equals
Catégorie Utilisation
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

Un type public implémente l’opérateur d’égalité, mais ne se substitue pas à System.Object.Equals.

Description de la règle

Le but d’un opérateur d’égalité est d’offrir un moyen pratique, du point de vue de la syntaxe, d’accéder aux fonctionnalités de la méthode Equals. Si vous implémentez l’opérateur d’égalité, sa logique doit être identique à celle de Equals.

Remarque

Cette règle s’applique uniquement au code Visual Basic. Le compilateur C# génère un avertissement distinct, CS0660.

Comment corriger les violations

Pour corriger une violation de cette règle, vous devez supprimer l’implémentation de l’opérateur d’égalité ou remplacer Equals et les deux méthodes doivent retourner les mêmes valeurs. Si l’opérateur d’égalité n’introduit pas de comportement incohérent, vous pouvez corriger la violation en fournissant une implémentation de Equals qui appelle la méthode Equals dans la classe de base.

Quand supprimer les avertissements

Vous pouvez supprimer un avertissement de cette règle de manière sûre si l’opérateur d’égalité retourne la même valeur que l’implémentation héritée de Equals. Les exemples de cet article incluent un type avec lequel un avertissement de cette règle peut être supprimé de manière sûre.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

L’exemple suivant montre une classe (type référence) qui enfreint cette règle.

' This class violates the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        If pt1 Is Nothing OrElse pt2 Is Nothing Then
            Return False
        End If

        If pt1.GetType() <> pt2.GetType() Then
            Return False
        End If

        Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1 = pt2
    End Operator

End Class

L’exemple suivant corrige la violation en remplaçant System.Object.Equals.

' This class satisfies the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj = Nothing Then
            Return False
        End If

        If [GetType]() <> obj.GetType() Then
            Return False
        End If

        Dim pt As Point = CType(obj, Point)

        Return X = pt.X AndAlso Y = pt.Y

    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Object.Equals(pt1, pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Not Object.Equals(pt1, pt2)
    End Operator

End Class

Voir aussi