Share via


CA1061: Dölj inte basklassmetoder

Property Värde
Regel-ID CA1061
Title Dölj inte basklassmetoder
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En härledd typ deklarerar en metod med samma namn och med samma antal parametrar som en av dess basmetoder. en eller flera av parametrarna är en bastyp för motsvarande parameter i basmetoden. och eventuella återstående parametrar har typer som är identiska med motsvarande parametrar i basmetoden.

Regelbeskrivning

En metod i en bastyp döljs av en identiskt namngiven metod i en härledd typ när parametersignaturen för den härledda metoden endast skiljer sig efter typer som är mer svagt härledda än motsvarande typer i parametersignaturen för basmetoden.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln tar du bort eller byter namn på metoden eller ändrar parametersignaturen så att metoden inte döljer basmetoden.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Exempel

I följande exempel visas en metod som bryter mot regeln.

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