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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:13:17