Partilhar via


CA1061: Não ocultar métodos de classe base

Property valor
ID da regra CA1061
Título Não oculte métodos de classe base
Categoria Desenho
A correção está quebrando ou não quebrando Quebrando
Habilitado por padrão no .NET 9 Como sugestão

Motivo

Um tipo derivado declara um método com o mesmo nome e com o mesmo número de parâmetros que um dos seus métodos base; um ou mais parâmetros é um tipo de base do parâmetro correspondente no método base; e quaisquer parâmetros restantes têm tipos que são idênticos aos parâmetros correspondentes no método base.

Descrição da regra

Um método em um tipo base é oculto por um método nomeado de forma idêntica em um tipo derivado quando a assinatura de parâmetro do método derivado difere apenas por tipos que são mais fracamente derivados do que os tipos correspondentes na assinatura de parâmetro do método base.

Como corrigir violações

Para corrigir uma violação dessa regra, remova ou renomeie o método ou altere a assinatura do parâmetro para que o método não oculte o método base.

Quando suprimir avisos

Não suprima um aviso desta regra.

Exemplo

O exemplo a seguir mostra um método que viola a regra.

class BaseType
{
    internal void MethodOne(string inputOne, object inputTwo)
    {
        Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
    }

    internal void MethodTwo(string inputOne, string inputTwo)
    {
        Console.WriteLine("Base: {0}, {1}", inputOne, inputTwo);
    }
}

class DerivedType : BaseType
{
    internal void MethodOne(string inputOne, string inputTwo)
    {
        Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
    }

    // This method violates the rule.
    internal void MethodTwo(string inputOne, object inputTwo)
    {
        Console.WriteLine("Derived: {0}, {1}", inputOne, inputTwo);
    }
}

class Test
{
    static void Main1061()
    {
        DerivedType derived = new DerivedType();

        // Calls DerivedType.MethodOne.
        derived.MethodOne("string1", "string2");

        // Calls BaseType.MethodOne.
        derived.MethodOne("string1", (object)"string2");

        // Both of these call DerivedType.MethodTwo.
        derived.MethodTwo("string1", "string2");
        derived.MethodTwo("string1", (object)"string2");
    }
}