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