CA1046:不要对引用类型重载相等运算符

类型名

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

类别

Microsoft.Design

是否重大更改

原因

公共或嵌套公共引用类型重载了相等运算符。

规则说明

对于引用类型,相等运算符的默认实现几乎始终是正确的。 默认情况下,仅当两个引用指向同一对象时,它们才相等。

如何解决冲突

要修复与该规则的冲突,请移除相等运算符的实现。

何时禁止显示警告

当引用类型的工作方式类似于内置值类型时,可以安全地禁止显示此规则发出的警告。 如果对类型的实例进行相加或相减有意义,则实现相等运算符并禁止显示冲突可能是正确的。

示例

下面的示例演示比较两个引用时的默认行为。

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:重载加法方法和减法方法时重载相等运算符

请参见

参考

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

Object.Equals