CA1033: I metodi di interfaccia devono essere richiamabili dai tipi figlio

Proprietà valore
ID regola CA1033
Titolo I metodi di interfaccia devono essere richiamabili dai tipi figlio
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un tipo visibile esternamente non sealed fornisce un'implementazione di metodo esplicita di un'interfaccia pubblica e non fornisce un metodo visibile esternamente alternativo con lo stesso nome.

Descrizione regola

Si consideri un tipo di base che implementa in modo esplicito un metodo di interfaccia pubblica. Un tipo che deriva dal tipo di base può accedere al metodo di interfaccia ereditato solo tramite un riferimento all'istanza corrente (this in C#) di cui viene eseguito il cast all'interfaccia. Se il tipo derivato riimplementa (in modo esplicito) il metodo di interfaccia ereditato, non è più possibile accedere all'implementazione di base. La chiamata tramite il riferimento all'istanza corrente richiamerà l'implementazione derivata; ciò causa la ricorsione e un overflow dello stack finale.

Questa regola non segnala una violazione per un'implementazione esplicita di System.IDisposable.Dispose quando viene fornito un metodo o System.IDisposable.Dispose(Boolean) visibile Close() esternamente.

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare un nuovo metodo che espone la stessa funzionalità ed è visibile ai tipi derivati o a un'implementazione nonxplicit. Se una modifica di rilievo è accettabile, un'alternativa consiste nel rendere bloccato il tipo.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se viene fornito un metodo visibile esternamente con la stessa funzionalità, ma un nome diverso rispetto al metodo implementato in modo esplicito.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un tipo, ViolatingBase, che viola la regola e un tipo , FixedBase, che mostra una correzione per la violazione.

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

Vedi anche