重写 ValueType.Equals 时应重载相等运算符
更新:2007 年 11 月
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));
}
}
}