共用方式為


CA2231:覆寫 ValueType.Equals 時必須一併多載等號比較運算子

型別名稱

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));
        }

    }

}

相關規則

CA1046:請勿多載參考型別上的等號比較運算子

CA2225:運算子多載必須有具名的替代方法

CA2226:運算子應該有對稱的多載

CA2224:多載等號比較運算子時必須一併覆寫 Equals

CA2218:覆寫 Equals 時必須一併覆寫 GetHashCode

請參閱

參考

Object.Equals