CA1066: Implementera IEquatable vid åsidosättande av lika med
Property | Värde |
---|---|
Regel-ID | CA1066 |
Title | Implementera IEquatable vid åsidosättande av lika med |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En värdetyp (struct) åsidosätter metoden, men implementerar Equals IEquatable<T>inte .
Regelbeskrivning
En värdetyp som Equals åsidosätter metoden anger att den stöder jämförelse av två instanser av typen för värdejämlikhet. Överväg att implementera IEquatable<T> gränssnittet för att stödja starkt skrivna tester för likhet. Detta säkerställer att anropare som utför likhetskontroller anropar den starkt skrivna System.IEquatable<T>.Equals metoden och undviker att boxa argumentet, vilket förbättrar prestandan. Mer information finns här.
Implementeringen System.IEquatable<T>.Equals bör returnera resultat som är konsekventa med Equals.
Så här åtgärdar du överträdelser
Åtgärda en överträdelse genom att implementera IEquatable<T> och uppdatera Equals åsidosättning för att anropa den här implementerade metoden. Följande två kodfragment visar till exempel ett brott mot regeln och hur du åtgärdar den:
public struct S
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && _value == otherS._value;
}
using System;
public struct S : IEquatable<S>
{
private readonly int _value;
public S(int f)
{
_value = f;
}
public override int GetHashCode()
=> _value.GetHashCode();
public override bool Equals(object other)
=> other is S otherS && Equals(otherS);
public bool Equals(S other)
=> _value == other._value;
}
När du ska ignorera varningar
Det är säkert att förhindra överträdelser från den här regeln om design- och prestandafördelarna med att implementera gränssnittet inte är kritiska.
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 CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066
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.CA1066.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.