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

C#默认接口实现传递性问题:为何出现未实现IFoo.Foo的错误?

问题原因与解决方案

这是C#默认接口实现(Default Interface Implementation, DII)的已知设计限制,并非Bug,核心逻辑在于默认接口实现的生效范围和类实现接口的契约要求:

1. 接口默认实现的生效边界

当子接口IBar为父接口IFoo的成员提供默认实现时,这个实现仅在通过IBar类型的引用调用该成员时生效。对于实现IBar的类Baz来说,编译器仍然要求它显式满足IFoo的契约——默认接口实现无法替代类的显式实现来完成父接口的成员绑定。

直白点说:接口的默认实现是给接口层面的调用兜底的,不是帮实现类“自动完成父接口契约”的,类实现接口时必须明确覆盖所有父接口的抽象成员。

2. new关键字为何无效

在IBar中给Foo(string)加new修饰符,只是告诉编译器“我明确要隐藏父接口的同名成员”,消除了成员隐藏的警告,但并没有改变“类必须实现IFoo.Foo(string)”的规则。这个new修饰的默认实现仍然属于IBar接口本身,和Baz需要满足的接口契约无关。

可行的解决方案

方案1:显式实现IFoo.Foo(string)并复用IBar的默认实现

让Baz显式实现IFoo的成员,直接调用IBar的默认实现即可:

public interface IFoo
{
    void Foo(string s);
}

public interface IBar : IFoo
{
    new void Foo(string s) => Console.WriteLine("IBar's default implementation");
}

public class Baz : IBar
{
    // 显式实现IFoo.Foo,复用IBar的默认逻辑
    void IFoo.Foo(string s) => ((IBar)this).Foo(s);
}

方案2:调整接口设计,避免父接口成员的强制实现

如果希望类不需要显式实现IFoo的成员,可以给IFoo本身的成员提供默认实现,而非定义抽象成员:

public interface IFoo
{
    // 给IFoo本身提供默认实现
    void Foo(string s) => Console.WriteLine("IFoo's default implementation");
}

public interface IBar : IFoo
{
    // 重写默认实现(可选)
    void Foo(string s) => Console.WriteLine("IBar's default implementation");
}

public class Baz : IBar
{
    // 此时不需要额外实现Foo,通过IBar/IFoo引用调用时会用对应接口的默认实现
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:14:59