CA1033:接口方法应可由子类型调用

属性
规则 ID CA1033
标题 接口方法应可由子类型调用
类别 设计
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

未密封的外部可见类型提供了显式实现公共接口的方法,但没有提供具有相同名称的其他外部可见方法。

规则说明

考虑到显式实现公共接口方法的基类型。 派生自该基类型的类型只能通过引用强制转换到接口的当前实例(C# 中的 this)来访问继承接口方法。 如果派生类型重新实现(显式)继承接口方法,则无法再访问基实现。 通过当前实例引用进行的调用将调用派生实现;这将导致递归和最终的堆栈溢出。

如果提供了外部可见的 Close()System.IDisposable.Dispose(Boolean) 方法,则此规则不会报告 System.IDisposable.Dispose 的显式实现冲突。

如何解决冲突

若要解决此规则的冲突,请实现新的方法,该方法公开相同的功能,并对派生类型可见或更改为非显示实现。 如果可接受中断性变更,还可以选择将类型设为密封类型。

何时禁止显示警告

如果提供了与显式实现的方法具有相同功能但名称不同的外部可见方法,则可以安全地禁止显示此规则的警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#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();
    }
}

另请参阅