CA1033: Os métodos de interface devem ser chamáveis por tipos filho
Property | valor |
---|---|
ID da regra | CA1033 |
Título | 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 9 | Não |
Motivo
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, 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();
}
}