CA1033: Gränssnittsmetoder bör kunna anropas av subtyper

Egenskap Värde
Regel-ID CA1033
Title Gränssnittsmetoder ska kunna anropas av subtyper
Kategori Design
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

En oförseglad externt synlig typ ger en explicit metodimplementering av ett publikt gränssnitt och tillhandahåller inte en annan externt synlig metod med 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 den härledda typen omimplementerar (explicitt) den ärvda gränssnittsmetoden, kan basimplementeringen inte längre nås. Anropet via den nuvarande instansreferensen kommer att utlösa den härledda implementeringen; detta orsakar rekursion och ett eventuellt stacköverflöd.

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 brytande ändring är acceptabel är ett alternativ att göra typen sluten.

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