Поделиться через


CA1061: не следует скрывать методы базового класса

Свойство Значение
Идентификатор правила CA1061
Заголовок Не скрывайте методы базовых классов
Категория Проектирование
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 9 Как предложение

Причина

Производный тип объявляет метод с тем же именем и тем же числом параметров, что и один из его базовых методов; один или несколько параметров являются базовым типом соответствующего параметра в базовом методе; все остальные параметры имеют типы, идентичные соответствующим параметрам в базовом методе.

Описание правила

Метод в базовом типе скрыт методом с таким же именем в производном типе, когда сигнатура параметра производного метода отличается только типами, которые унаследованы слабее, чем соответствующие типы в сигнатуре параметра базового метода.

Устранение нарушений

Чтобы устранить нарушение этого правила, удалите или переименуйте метод или измените сигнатуру параметра, чтобы метод не скрывал базовый метод.

Когда лучше отключить предупреждения

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан метод, нарушающий это правило.

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