CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします

プロパティ
ルール ID CA2224
Title オーバーロードする演算子 equals で Equals をオーバーライドします
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

パブリック型で等値演算子が実装されていますが、System.Object.Equals がオーバーライドされていません。

規則の説明

等値演算子は、Equals メソッドの機能に構文的に便利な方法でアクセスすることが意図されています。 等値演算子を実装する場合、そのロジックは Equals のそれと同じにする必要があります。

メモ

この規則は Visual Basic コードにのみ適用されます。 C# コンパイラでは、別個の警告 CS0660 が生成されます。

違反の修正方法

この規則違反を修正するには、等値演算子の実装を削除するか、Equals をオーバーライドし、2 つのメソッドに同じ値を返させます。 等値演算子で不整合な動作が発生しない場合、基底クラスで Equals を呼び出す Equals を実装することで違反を修正できます。

どのようなときに警告を抑制するか

等値演算子から Equals の継承実装と同じ値が返される場合、この規則からの警告を抑制しても問題ありません。 この記事の例では、この規則からの警告を抑制しても問題ない型が含まれています。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

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

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

次の例では、この規則に違反するクラス (参照型) を確認できます。

' 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

次の例では、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

関連項目