CA1033: методы интерфейса должны быть доступны для вызова дочерним типам
Свойство | Значение |
---|---|
Идентификатор правила | CA1033 |
Заголовок | Методы интерфейса должны быть доступны для вызова дочерними типами |
Категория | Проектирование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Незапечатанный тип, доступный для внешнего кода, предоставляет явную реализацию метода открытого интерфейса и не предоставляет доступный для внешнего кода альтернативный метод с тем же именем.
Описание правила
Рассмотрим базовый тип, который явно реализует общий метод интерфейса. Тип, производный от базового типа, может обращаться к унаследованному методу интерфейса только с помощью ссылки на текущий экземпляр (this
в C#), приведенный к интерфейсу. Если производный тип повторно реализует (явным образом) наследуемый метод интерфейса, базовая реализация становится недоступной. Вызов с помощью ссылки на текущий экземпляр вызовет производную реализацию. Это приведет к рекурсии и в конечном итоге переполнению стека.
Это правило не сообщает о нарушении явной реализации System.IDisposable.Dispose, если предоставлен видимый снаружи метод Close()
или System.IDisposable.Dispose(Boolean)
.
Устранение нарушений
Чтобы устранить нарушение этого правила, реализуйте новый метод, который предоставляет те же функциональные возможности, но при этом является видимым для производных типов, или замените на неявную реализацию. Если критическое изменение допустимо, можно также сделать тип запечатанным.
Когда лучше отключить предупреждения
Предупреждение из этого правила можно отключить, если предоставляется видимый извне метод, имеющий те же функциональные возможности, но с именем, отличным от имени явно реализованного метода.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Пример
В следующем примере показан тип ViolatingBase
, который нарушает правило, и тип FixedBase
, демонстрирующий исправление нарушения.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}