CA1066: Equals をオーバーライドする際に IEquatable を実装します
プロパティ | 値 |
---|---|
ルール ID | CA1066 |
Title | Equals をオーバーライドする際に IEquatable を実装します |
[カテゴリ] | デザイン |
修正が中断ありか中断なしか | なし |
.NET 9 では既定で有効 | いいえ |
原因
値の型 (構造体) では、Equals をオーバーライドしていますが、IEquatable<T>を実装していません。
規則の説明
Equals メソッドをオーバーライドする値の型からは、値の同等性に関して型の 2 つのインスタンスを比較できることが示されます。 同等性に関する厳密に型指定されたテストがサポートされるよう、IEquatable<T> インターフェイスの実装を検討してください。 それにより確実に、同等性を確認する呼び出し元は厳密に型指定された System.IEquatable<T>.Equals メソッドを呼び出し、引数のボックス化を回避し、パフォーマンスを改善します。 詳細については、このページを参照してください。
System.IEquatable<T>.Equals 実装からは、Equals と一致する結果が返されなければなりません。
違反の修正方法
違反を修正するには、IEquatable<T> を実装し、この実装されたメソッドを呼び出すよう、Equals オーバーライドを更新します。 たとえば、次の 2 つのコード スニペットは、規則違反とその修正方法を示しています。
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
どのようなときに警告を抑制するか
設計およびパフォーマンス上、このインターフェイスを実装することの利点が重大ではない場合、この規則からの違反を抑制しても安全です。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
関連規則
関連項目
.NET