Compartilhar via


CA1033: Métodos de interface devem ser chamados por tipos filho

Property Valor
ID da regra CA1033
Título Métodos de interface devem ser chamados por tipos filho
Categoria Projetar
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Não

Causa

Um tipo visível externamente sem lacre fornece uma implementação de método explícita de uma interface pública e não fornece um método visível externamente alternativo com o mesmo nome.

Descrição da regra

Considere um tipo base que implementa explicitamente um método de interface pública. Um tipo que deriva do tipo base pode acessar o método de interface herdado somente por meio de uma referência à instância atual (this em C#) que é convertida para a interface. Se o tipo derivado reimplementar (explicitamente) o método de interface herdado, a implementação base não poderá mais ser acessada. A chamada por meio da referência da instância atual invocará a implementação derivada; isso causa recursão e um eventual excedente de pilha.

Essa regra não relata uma violação para uma implementação explícita de System.IDisposable.Dispose quando um método Close() ou System.IDisposable.Dispose(Boolean) externamente visível é fornecido.

Como corrigir violações

Para corrigir uma violação dessa regra, implemente um novo método que exponha a mesma funcionalidade e seja visível para tipos derivados ou altere para uma implementação não explícita. Se uma alteração interruptiva for aceitável, uma alternativa será tornar o tipo selado.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se um método externamente visível for fornecido que tenha a mesma funcionalidade, mas um nome diferente do método explicitamente implementado.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Exemplo

O exemplo a seguir mostra um tipo, ViolatingBase, que viola essa regra e um tipo, FixedBase, que mostra uma correção para a violação.

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

Confira também