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 をオーバーロードします
参照
関連項目
その他の技術情報
Guidelines for Implementing Equals and the Equality Operator (==)