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