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, ViolatingBase
který porušuje pravidlo a typ, FixedBase
který 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();
}
}