Share via


CA2231:重写 ValueType.Equals 时应重载相等运算符

类型名

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:不要对引用类型重载相等运算符

CA2225:运算符重载具有命名的备用项

CA2226:运算符应有对称重载

CA2224:重载相等运算符时重写 Equals 方法

CA2218:重写 Equals 时重写 GetHashCode

请参见

参考

Object.Equals