C# 8.0中如何调用被重写接口方法的默认实现?
C# 8.0 默认接口实现:官方文档代码问题及解决方案
问题描述
我在使用C# 8.0的默认接口实现功能时,发现官方文档给出的代码示例存在问题。文档称可以通过IBaseInterface.base.Method()语法从派生接口调用基接口的默认实现,示例代码如下:
interface I0 { void M() { Console.WriteLine("I0"); } } interface I1 : I0 { override void M() { Console.WriteLine("I1"); } } interface I2 : I0 { override void M() { Console.WriteLine("I2"); } } interface I3 : I1, I2 { // an explicit override that invoke's a base interface's default method void I0.M() { I2.base.M(); } }
但实际运行时这段代码会报错:
- 接口方法定义中无法使用
override关键字; I2.base.M()的语法不正确。
我想确认文档是否存在错误,同时想知道如果这段代码无效,有没有办法从I3接口实例执行I0.M()的默认实现(即输出"I0"的逻辑)。
目前我只能通过以下变通方案实现需求:
interface I0 { protected static void DefaultM() { Console.WriteLine("I0"); } void M() { DefaultM(); } } interface I1 : I0 { void I0.M() { Console.WriteLine("I1"); } } interface I2 : I0 { void I0.M() { Console.WriteLine("I2"); } } interface I3 : I1, I2 { // an explicit override that invoke's a base interface's default method void I0.M() { I0.DefaultM(); } }
解决方案
1. 官方文档代码确实存在错误
文档里的示例有两处不符合C# 8.0语法规范:
- 接口中不能使用
override关键字重写基接口的默认方法,正确方式是使用显式接口实现覆盖基接口的默认方法; - 调用基接口默认实现的语法应为
base<InterfaceName>.Method(),而非InterfaceName.base.Method()。
2. 正确调用I0默认实现的代码
要在I3的I0.M()实现中调用I0的默认逻辑,可修改代码如下:
interface I0 { void M() { Console.WriteLine("I0"); } } interface I1 : I0 { // 用显式接口实现覆盖I0的默认方法 void I0.M() { Console.WriteLine("I1"); } } interface I2 : I0 { // 用显式接口实现覆盖I0的默认方法 void I0.M() { Console.WriteLine("I2"); } } interface I3 : I1, I2 { void I0.M() { // 调用I0接口的默认实现 base<I0>.M(); } }
将I3实例转换为I0接口并调用M()时,就会执行I0的默认逻辑,输出"I0"。
3. 你的变通方案是可行的
你通过将默认逻辑提取到protected static方法中的方式,确实可以绕过接口调用的语法限制,实现复用I0默认逻辑的需求。这种方案在需要多次复用默认实现时也很实用。
内容的提问来源于stack exchange,提问作者Rubén Cantón
相关产品推荐
相关产品推荐

