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