CA1061: Non nascondere i metodi di una classe base

Proprietà valore
ID regola CA1061
Title Non nascondere i metodi di una classe base
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Un tipo derivato dichiara un metodo con lo stesso nome e con lo stesso numero di parametri di uno dei metodi di base; uno o più parametri sono un tipo di base del parametro corrispondente nel metodo di base; e gli eventuali parametri rimanenti hanno tipi identici ai parametri corrispondenti nel metodo di base.

Descrizione regola

Un metodo in un tipo di base è nascosto da un metodo con nome identico in un tipo derivato quando la firma del parametro del metodo derivato differisce solo per i tipi derivati più deboli rispetto ai tipi corrispondenti nella firma del parametro del metodo di base.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere o rinominare il metodo oppure modificare la firma del parametro in modo che il metodo non nasconda il metodo di base.

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio seguente viene illustrato un metodo che viola la regola.

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