覆寫 ValueType.Equals 時必須一併多載等號比較運算子
更新:2007 年 11 月
型別名稱 |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA2231 |
分類 |
Microsoft.Usage |
中斷變更 |
非中斷 |
原因
實值型別 (Value Type) 會覆寫 Object.Equals,但並未實作等號比較運算子。
規則描述
在大部分程式語言中沒有實值型別的等號比較運算子 (==) 的預設實作。如果您的程式語言支援運算子多載,您應該考慮實作等號比較運算子。它的行為應該與 Equals 的行為完全相同。
您無法在等號比較運算子的多載實作中,使用預設的等號比較運算子。這樣做會導致堆疊溢位 (Stack Overflow)。若要實作等號比較運算子,請在實作中使用 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));
}
}
}