Udostępnij za pośrednictwem


CA1061: Nie należy ukrywać metod klasy bazowej

Właściwości Wartość
Identyfikator reguły CA1061
Tytuł Nie ukrywaj metod klasy bazowej
Kategoria Projekt
Poprawka powodująca niezgodność lub niezgodność Kluczowa
Domyślnie włączone na platformie .NET 9 Jako sugestia

Przyczyna

Typ pochodny deklaruje metodę o tej samej nazwie i o tej samej liczbie parametrów co jedna z jej metod podstawowych; co najmniej jeden parametr jest podstawowym typem odpowiedniego parametru w metodzie podstawowej; i wszystkie pozostałe parametry mają typy, które są identyczne z odpowiednimi parametrami w metodzie podstawowej.

Opis reguły

Metoda w typie podstawowym jest ukryta przez identycznie nazwaną metodę w typie pochodnym, gdy podpis parametru metody pochodnej różni się tylko typami, które są bardziej słabo pochodne niż odpowiadające im typy w podpisie parametru metody podstawowej.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, usuń lub zmień nazwę metody albo zmień sygnaturę parametru tak, aby metoda nie ukrywała metody podstawowej.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Przykład

W poniższym przykładzie przedstawiono metodę, która narusza regułę.

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