Partilhar via


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

Propriedade valor
ID da regra CA1033
Cargo Os métodos de interface devem ser chamáveis por tipos filho
Categoria Desenho
A correção está quebrando ou não quebrando Sem quebra
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ícito de uma interface pública e não fornece um método alternativo visível externamente que tenha 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 ou System.IDisposable.Dispose(Boolean) visível Close() externamente é 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 mudança de quebra for aceitável, uma alternativa é fazer 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, , que viola a regra e um tipo, , ViolatingBaseFixedBaseque 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