CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします
プロパティ | 値 |
---|---|
ルール ID | CA2224 |
Title | オーバーロードする演算子 equals で Equals をオーバーライドします |
[カテゴリ] | 使用方法 |
修正が中断ありか中断なしか | なし |
.NET 9 では既定で有効 | 提案として |
原因
パブリック型で等値演算子が実装されていますが、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
関連規則
- CA1046: 参照型で、演算子 equals をオーバーロードしないでください
- CA2218: オーバーライドする Equals で GetHashCode をオーバーライドします
- CA2225: 演算子オーバーロードには名前付けされた代替が存在します
- CA2226: 演算子は対称型オーバーロードを含まなければなりません
- CA2231: ValueType.Equals のオーバーライドで、演算子 equals をオーバーロードします
関連項目
.NET