Condividi tramite


CA2231: Eseguire l'overload dell'operatore "uguale a" all'override di ValueType.Equals

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Category

Microsoft.Usage

Breaking Change

Non sostanziale

Causa

Un tipo di valore esegue l'override di Object.Equals, ma non implementa l'operatore di uguaglianza.

Descrizione della regola

La maggior parte dei linguaggi di programmazione non prevede un'implementazione predefinita dell'operatore di uguaglianza (==) per i tipi di valore. Se il linguaggio di programmazione in uso supporta gli overload dell'operatore, è consigliabile implementare l'operatore di uguaglianza. Il relativo comportamento dovrebbe essere identico a quello di Equals.

Non è possibile utilizzare l'operatore di uguaglianza predefinito in un'implementazione di overload dell'operatore di uguaglianza. Questa operazione causerebbe un overflow dello stack. Per implementare l'operatore di uguaglianza, utilizzare il metodo Object.Equals nell'implementazione. Di seguito è riportato un esempio.

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

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare l'operatore di uguaglianza.

Esclusione di avvisi

L'esclusione di un avviso da questa regola è sicura; è tuttavia consigliabile fornire l'operatore di uguaglianza, se possibile.

Esempio

Nell'esempio riportato di seguito viene definito un tipo che viola questa regola.

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

    }

}

Regole correlate

CA1046: Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento

CA2225: Gli overload degli operatori hanno alternative con nome

CA2226: Gli operatori devono avere overload simmetrici

CA2224: Eseguire l'override di Equals all'override dell'operatore

CA2218: Eseguire l'override di GetHashCode all'override di Equals

Vedere anche

Riferimenti

Object.Equals