CA2231: ValueType.Equals のオーバーライドで、演算子 equals をオーバーロードします
TypeName |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA2231 |
分類 |
Microsoft.Usage |
互換性に影響する変更点 |
なし |
原因
値型は Object.Equals をオーバーロードしますが、等値演算子は実装していません。
規則の説明
ほとんどのプログラミング言語では、値型に対する等値演算子 (==) の既定の実装がありません。プログラミング言語で演算子のオーバーロードをサポートしている場合、等値演算子の実装を考慮してください。等値演算子の動作は、Equals と同様です。
等値演算子がオーバーロードされた実装では、既定の等値演算子は使用できません。使用すると、スタック オーバーフローが発生します。等値演算子を実装するには、Object.Equals メソッドを使用します。たとえば、次のようになります。
If (Object.ReferenceEquals(left, Nothing)) Then
Return Object.ReferenceEquals(right, Nothing)
Else
Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null))
return Object.ReferenceEquals(right, null);
return left.Equals(right);
違反の修正方法
この規則違反を修正するには、等値演算子を実装します。
警告を抑制する状況
この規則による警告は抑制しても安全ですが、可能であれば等値演算子を実装することをお勧めします。
使用例
この規則に違反する型の定義を次の例に示します。
using System;
namespace UsageLibrary
{
public struct PointWithoutHash
{
private int x,y;
public PointWithoutHash(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return String.Format("({0},{1})",x,y);
}
public int X {get {return x;}}
public int Y {get {return x;}}
// Violates rule: OverrideGetHashCodeOnOverridingEquals.
// Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals.
public override bool Equals (object obj)
{
if (obj.GetType() != typeof(PointWithoutHash))
return false;
PointWithoutHash p = (PointWithoutHash)obj;
return ((this.x == p.x) && (this.y == p.y));
}
}
}
関連規則
CA1046: 参照型で、演算子 equals をオーバーロードしないでください
CA2225: 演算子オーバーロードには名前付けされた代替が存在します
CA2226: 演算子は対称型オーバーロードを含まなければなりません
CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします
CA2218: オーバーライドする Equals で GetHashCode をオーバーライドします