CA1033: Gränssnittsmetoder bör kunna anropas av underordnade typer
Property | Värde |
---|---|
Regel-ID | CA1033 |
Title | Gränssnittsmetoder ska kunna anropas av underordnade typer |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En oförseglat externt synlig typ ger en explicit metodimplementering av ett offentligt gränssnitt och tillhandahåller inte en alternativ externt synlig metod som har samma namn.
Regelbeskrivning
Överväg en bastyp som uttryckligen implementerar en offentlig gränssnittsmetod. En typ som härleds från bastypen kan endast komma åt den ärvda gränssnittsmetoden via en referens till den aktuella instansen (this
i C#) som skickas till gränssnittet. Om omsampling av härledd typ (explicit) den ärvda gränssnittsmetoden kan basimplementeringen inte längre nås. Anropet via den aktuella instansreferensen anropar den härledda implementeringen. Detta orsakar rekursion och ett eventuellt stackspill.
Den här regeln rapporterar inte en överträdelse för en explicit implementering av System.IDisposable.Dispose när en externt synlig Close()
eller System.IDisposable.Dispose(Boolean)
metod tillhandahålls.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln implementerar du en ny metod som exponerar samma funktioner och är synlig för härledda typer eller ändrar till en icke-explicerad implementering. Om en icke-bakåtkompatibel ändring är acceptabel är ett alternativ att göra typen förseglad.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om en externt synlig metod tillhandahålls som har samma funktioner men ett annat namn än den uttryckligen implementerade metoden.
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 CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
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.CA1033.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
I följande exempel visas en typ, ViolatingBase
, som bryter mot regeln och en typ, FixedBase
, som visar en korrigering för överträdelsen.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}