Share via


CA1033: Gränssnittsmetoder bör kunna anropas av underordnade typer

Property Värde
Regel-ID CA1033
Rubrik Gränssnittsmetoder ska kunna anropas av underordnade typer
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 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();
    }
}

Se även