次の方法で共有


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

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

分類

Microsoft.Design

互換性に影響する変更点

あり

原因

パブリックの参照型または入れ子になったパブリックの参照型が、等値演算子をオーバーロードしています。

規則の説明

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

違反の修正方法

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

警告を抑制する状況

参照型が組み込みの値型のように動作する場合は、この規則による警告を抑制しても安全です。型のインスタンスで加算または減算を実行する意味がある場合、多くは、等値演算子を実装して警告を抑制することが適切です。

使用例

2 つの参照を比較するときの既定の動作を次の例に示します。

using System;

namespace DesignLibrary
{
   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);
      }
   }
}

次のアプリケーションでは、いくつかの参照を比較しています。

using System;

namespace DesignLibrary
{
    public class ReferenceTypeEquality
    {
       public static void Main()
       {
          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");     
       }
    }
}

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

              

関連規則

CA1013: オーバーロードする加算および減算で、演算子 equals をオーバーロードします

参照

関連項目

Object.Equals

その他の技術情報

Guidelines for Implementing Equals and the Equality Operator (==)