You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中从同名显式接口方法调用类普通方法是否为已定义行为

问题结论

这是C#语言标准明确定义的合规行为,不属于编译器特殊处理或者未定义的实现特定行为,你给出的示例代码输出Something!是完全符合预期的标准行为。

规则说明

C#里的显式接口实现方法,本质是类中一个只能通过对应接口类型访问的专用成员,它和类内部自己定义的同名普通方法是完全独立的两个方法,根本不会有命名冲突——显式接口实现的方法不参与类自身的成员命名匹配,只有在做接口映射的时候才会被编译器识别。

在显式接口方法的方法体里,成员查找的逻辑和类里其他普通实例方法没有任何区别:

  • 你写不带任何限定的DoSomething()调用时,编译器会按照类实例成员的查找规则,优先匹配类自己定义的、当前上下文有权限访问的DoSomething()成员,也就是你示例里写的私有方法,所以会正常输出内容,根本不会递归调用到显式接口方法本身。
  • 要是你想在类内部调用这个显式实现的接口方法,必须显式把this转成ISomething类型再调用,也就是写((ISomething)this).DoSomething()才会调到显式实现的版本,直接写无修饰的方法名,永远不会匹配到显式实现的接口方法。

你可以自己做个简单验证:把示例里类定义的私有DoSomething()删掉,这段代码会直接编译报错,因为编译器在类的实例成员里找不到匹配的DoSomething(),也不会自动把无修饰的调用绑定到显式接口实现上,这个表现也完全符合C#标准里明确规定的成员查找规则。

内容的提问来源于stack exchange,提问作者Mark Jansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:51:15