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

2022-01-10 09:36:50 浏览数 (2)

“值”

RuleId

CA1033

类别

设计

修复是中断修复还是非中断修复

非中断

原因

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

规则说明

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

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

如何解决冲突

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

何时禁止显示警告

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

抑制警告

可以通过多种方式来禁止显示代码分析警告,包括禁用项目的规则、使用预处理器指令为特定代码行禁用该规则或应用 SuppressMessageAttribute 特性。 有关详细信息,请参阅如何禁止显示代码分析警告。

示例

下面的示例显示了一个与此规则冲突的 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();

}

}

另请参阅

接口

0 人点赞