次の方法で共有


CA1067: IEquatable を実装するときに Equals をオーバーライドします

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

原因

型では IEquatable<T> を実装していますが、Equals メソッドをオーバーライドしていません。

規則の説明

IEquatable<T> インターフェイスが実装されている型は、その型の 2 つのインスタンスの等価性の比較がサポートされていることを示しています。 また、Equals メソッドと GetHashCode() メソッドの基底クラスの実装をオーバーライドして、その動作が System.IEquatable<T>.Equals 実装の動作と一貫性を保つようにする必要があります。 詳細については、こちらを参照してください。

Equals の実装からは、System.IEquatable<T>.Equals の実装と一致する結果が返されなければなりません。

違反の修正方法

違反を修正するには、Equals をオーバーライドし、System.IEquatable<T>.Equals の実装を呼び出すことで実装します。 たとえば、次の 2 つのコード スニペットは、規則違反とその修正方法の例を示しています。

using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;
}
using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;

    public override bool Equals(object obj)
        => obj is S objS && Equals(objS);

    public override int GetHashCode()
        => _value.GetHashCode();
}

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

この規則の違反は抑制しないでください。

関連項目