Udostępnij za pośrednictwem


CA2231: Przeciąż operator equals przy zastępowaniu ValueType.Equals

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ wartości zastępuje Object.Equals , ale nie implementuje operatora równości.

Opis reguły

W większości języków programowania nie ma domyślnej implementacji operatora równości (==) dla typów wartości.Jeśli język programowania obsługuje przeciążenie operatorów, należy rozważyć implementację operatora równości.Jego zachowanie powinno być identyczne z Equals.

Nie można używać domyślnego operatora równości w przeciążonej implementacji operatora równości.Spowoduje to przepełnienie stosu.Aby zaimplementować operator równości, należy użyć metody Object.Equals w implementacji.Na przykład:

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

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zaimplementować operator równości.

Kiedy pominąć ostrzeżenia

Można bezpiecznie wyłączyć ostrzeżenia od tej zasady; jednak zaleca się, aby zapewnić operator równości jeśli to możliwe.

Przykład

W poniższym przykładzie zdefiniowano typ, który narusza tą regułę.

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

    }

}

Powiązane reguły

CA1046: Nie przeciążaj operatora equals w typach referencyjnych

CA2225: Operator overloads ma nazwanych zastępców

CA2226: Operatory powinny być przeciążane symetrycznie

CA2224: Zastąp metodę equals przeciążając operator equals

CA2218: Zastąp GetHashCode przy zastępowaniu Equals

Zobacz też

Informacje

Object.Equals