Freigeben über


CA1033: Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können.

Eigenschaft Wert
Regel-ID CA1033
Titel Schnittstellenmethoden sollten von untergeordneten Typen aufgerufen werden können.
Kategorie Design
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Ein unversiegelter, extern sichtbarer Typ gibt eine explizite Methodenimplementierung einer öffentlichen Schnittstelle an und gibt keine alternative extern sichtbare Methode mit dem gleichen Namen an.

Regelbeschreibung

Ziehen Sie einen Basistyp in Erwägung, der eine öffentliche Schnittstellenmethode explizit implementiert. Ein Typ, der vom Basistyp abgeleitet wird, kann nur über einen Verweis auf die aktuelle Instanz (this in C#) auf die geerbte Schnittstellenmethode zugreifen, die in die Schnittstelle umgewandelt wird. Wenn der abgeleitete Typ die geerbte Schnittstellenmethode (explizit) neu implementiert, kann auf die Basisimplementierung nicht mehr zugegriffen werden. Durch den Aufruf über den aktuellen Instanzverweis wird die abgeleitete Implementierung aufgerufen. Dies bewirkt eine Rekursion und einen eventuellen Stapelüberlauf.

Diese Regel meldet keine Verstöße gegen eine explizite Implementierung von System.IDisposable.Dispose, wenn eine extern sichtbare Close()- oder System.IDisposable.Dispose(Boolean)-Methode bereitgestellt wird.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie eine neue Methode, die die gleiche Funktionalität verfügbar macht und für abgeleitete Typen sichtbar ist, oder wechseln Sie zu einer nicht expliziten Implementierung. Wenn ein Breaking Change akzeptabel ist, besteht eine Alternative darin, den Typ zu versiegeln.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn eine extern sichtbare Methode bereitgestellt wird, die über die gleiche Funktionalität, aber einen anderen Namen als die explizit implementierte Methode verfügt.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

Das folgende Beispiel zeigt einen Typ, ViolatingBase, der gegen die Regel verstößt, und einen Typ, FixedBase, der den Regelverstoß rückgängig macht.

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

Siehe auch