C#中从同名显式接口方法调用类普通方法是否为已定义行为
问题结论
这是C#语言标准明确定义的合规行为,不属于编译器特殊处理或者未定义的实现特定行为,你给出的示例代码输出Something!是完全符合预期的标准行为。
规则说明
C#里的显式接口实现方法,本质是类中一个只能通过对应接口类型访问的专用成员,它和类内部自己定义的同名普通方法是完全独立的两个方法,根本不会有命名冲突——显式接口实现的方法不参与类自身的成员命名匹配,只有在做接口映射的时候才会被编译器识别。
在显式接口方法的方法体里,成员查找的逻辑和类里其他普通实例方法没有任何区别:
- 你写不带任何限定的
DoSomething()调用时,编译器会按照类实例成员的查找规则,优先匹配类自己定义的、当前上下文有权限访问的DoSomething()成员,也就是你示例里写的私有方法,所以会正常输出内容,根本不会递归调用到显式接口方法本身。 - 要是你想在类内部调用这个显式实现的接口方法,必须显式把
this转成ISomething类型再调用,也就是写((ISomething)this).DoSomething()才会调到显式实现的版本,直接写无修饰的方法名,永远不会匹配到显式实现的接口方法。
你可以自己做个简单验证:把示例里类定义的私有DoSomething()删掉,这段代码会直接编译报错,因为编译器在类的实例成员里找不到匹配的DoSomething(),也不会自动把无修饰的调用绑定到显式接口实现上,这个表现也完全符合C#标准里明确规定的成员查找规则。
内容的提问来源于stack exchange,提问作者Mark Jansen
相关产品推荐
相关产品推荐

