CA1046:参照型で、演算子 equals をオーバーロードしないでください

プロパティ
ルール ID CA1046
Title 参照型で、演算子 equals をオーバーロードしないでください
[カテゴリ] デザイン
修正が中断ありか中断なしか あり
.NET 8 では既定で有効 いいえ

原因

ある public または入れ子になった public 参照型により等値演算子がオーバーロードされます。

規則の説明

参照型の場合、等値演算子は既定の実装でほぼ問題がありません。 既定で、2 つの参照が等値と見なされるのは、同じオブジェクトを参照する場合のみです。

違反の修正方法

この規則の違反を修正するには、等値演算子の実装を削除します。

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

参照型が組み込みの値の型のようにふるまう場合、この規則からの警告を非表示にしても問題ありません。 型のインスタンスで加算や減算を行うことに意味がある場合、等値演算子を実装し、違反を非表示にしても問題ないでしょう。

警告を抑制する

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

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

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

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

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

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。

このオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

例 1

次の例では、2 つの参照を比較するときの既定の動作を確認できます。

public class MyReferenceType
{
    private int a, b;
    public MyReferenceType(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public override string ToString()
    {
        return String.Format("({0},{1})", a, b);
    }
}

例 2

次のアプリケーションでは、一部の参照が比較されます。

public class ReferenceTypeEquality
{
    public static void Main1046()
    {
        MyReferenceType a = new MyReferenceType(2, 2);
        MyReferenceType b = new MyReferenceType(2, 2);
        MyReferenceType c = a;

        Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a, b, a.Equals(b) ? "Yes" : "No");
        Console.WriteLine("c and a are equal? {0}", c.Equals(a) ? "Yes" : "No");
        Console.WriteLine("b and a are == ? {0}", b == a ? "Yes" : "No");
        Console.WriteLine("c and a are == ? {0}", c == a ? "Yes" : "No");
    }
}

この例を実行すると、次の出力が生成されます。

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

関連項目