前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CA1033:接口方法应可由子类型调用

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

作者头像
用户4268038
发布2022-01-10 09:36:50
4840
发布2022-01-10 09:36:50
举报
文章被收录于专栏:stcnbstcnb

“值”

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

}

}

另请参阅

接口

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档