CA1066: Equals をオーバーライドする際に IEquatable を実装します

プロパティ
ルール ID CA1066
Title Equals をオーバーライドする際に IEquatable を実装します
[カテゴリ] デザイン
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

値の型 (構造体) では、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

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

関連項目