CA2231: Överlagringsoperatorn är lika med vid åsidosättande av ValueType.Equals
Property | Värde |
---|---|
Regel-ID | CA2231 |
Title | Överlagringsoperatorn är lika med vid åsidosättande av ValueType.Equals |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En värdetyp åsidosätter System.Object.Equals men implementerar inte likhetsoperatorn.
Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.
Regelbeskrivning
I de flesta programmeringsspråk finns det ingen standardimplementering av likhetsoperatorn (==) för värdetyper. Om programmeringsspråket har stöd för överbelastning av operatorn bör du överväga att implementera likhetsoperatorn. Dess beteende bör vara identiskt med Equals.
Du kan inte använda standardjämlikhetsoperatorn i en överbelastad implementering av likhetsoperatorn. Om du gör det orsakas ett stackspill. Om du vill implementera likhetsoperatorn använder du metoden Object.Equals i implementeringen. Till exempel:
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);
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln implementerar du likhetsoperatorn.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln. Vi rekommenderar dock att du anger likhetsoperatorn om möjligt.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2231
// The code that's violating the rule is on this line.
#pragma warning restore CA2231
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2231.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (användning) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Inkludera specifika API-ytor
Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Exempel
I följande exempel definieras en typ som bryter mot den här regeln:
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));
}
}
Relaterade regler
- CA1046: Överlagrar inte operatorn är lika med referenstyper
- CA2225: Operatoröverlagringar har namngett alternativ
- CA2226: Operatorer bör ha symmetriska överlagringar