Sdílet prostřednictvím


CA1033: Metody rozhraní by měla být volatelné podřízenými typy

Vlastnost Hodnota
ID pravidla CA1033
Název Metody rozhraní by měly být volatelné podřízenými typy
Kategorie Návrh
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Nezapečetěný externě viditelný typ poskytuje explicitní implementaci metod veřejného rozhraní a neposkytuje alternativní externě viditelnou metodu stejného názvu.

Popis pravidla

Zvažte základní typ, který explicitně implementuje metodu veřejného rozhraní. Typ odvozený ze základního typu má přístup k zděděné metodě rozhraní pouze prostřednictvím odkazu na aktuální instanci (this v jazyce C#), která je přetypována do rozhraní. Pokud odvozený typ reimplements (explicitně) zděděné rozhraní metoda, základní implementace již nelze získat přístup. Volání prostřednictvím aktuálního odkazu na instanci vyvolá odvozenou implementaci; to způsobí rekurze a případný přetečení zásobníku.

Toto pravidlo neohlásí porušení explicitní implementace System.IDisposable.Dispose , kdy je k dispozici externě viditelná Close() metoda nebo System.IDisposable.Dispose(Boolean) metoda.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, implementujte novou metodu, která zveřejňuje stejné funkce a je viditelná pro odvozené typy nebo změnit implementaci bez duplicit. Pokud je změna způsobující chybu přijatelná, je alternativou provedení zapečetěného typu.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, pokud je k dispozici externě viditelná metoda, která má stejné funkce, ale jiný název než explicitně implementovaná metoda.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující příklad ukazuje typ, ViolatingBasekterý porušuje pravidlo a typ, FixedBasekterý ukazuje opravu porušení.

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();
    }
}

Viz také