Condividi tramite


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

Aggiornamento: novembre 2007

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 l'overflow dello stack. Per implementare l'operatore di uguaglianza, utilizzare il metodo Object.Equals nell'implementazione. Ad 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);

Correzione di 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

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

Gli overload degli operatori hanno alternative con nome

Gli operatori devono avere overload simmetrici

Eseguire l'override di Equals all'overload dell'operatore "uguale a"

Eseguire l'override di GetHashCode all'override di Equals

Vedere anche

Riferimenti

Object.Equals