Partilhar via


CA1033: Os métodos de interface devem ser chamáveis por tipos derivados

Propriedade valor
ID da regra CA1033
Título Os métodos de interface devem ser chamáveis por tipos derivados
Categoria Desenho
A correção causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Não
Línguas aplicáveis C# e Visual Basic

Motivo

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

Descrição da regra

Considere um tipo base que implemente 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 na 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 através da referência de instância atual invocará a implementação derivada; Isso causa recursão e um eventual estouro de pilha.

Esta 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) visíveis externamente são disponibilizados.

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 disruptiva for aceitável, uma alternativa é tornar o tipo selado.

Quando suprimir avisos

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

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Exemplo

O exemplo a seguir mostra um tipo, ViolatingBase, que viola a 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();
    }
}

Consulte também