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

.NET 6/7中C#接口默认方法无法通过类实例调用的问题

问题原因与解决方案

错误原因

C# 接口的默认方法不会被自动提升为实现类的公共成员,所以C1实例直接调用SetId时,编译器找不到该方法——因为C1既没有自己实现SetId,也没有将接口默认方法暴露为类成员。

解决方案

要实现你的需求,有两种可行方式:

方式一:通过接口类型调用默认方法

将C1实例转换为IXProcRow接口类型后调用SetId,这样会触发接口的默认实现:

var t1 = new C1();
((IXProcRow)t1).SetId(0); // 执行IXProcRow的默认SetId实现,给Id赋值

var t2 = new C2();
t2.SetId(0); // 执行C2自己的SetId实现,输出"i am here"

方式二:在C1中显式转发调用接口默认方法

如果希望直接用C1实例调用SetId,可以在C1中添加方法,显式调用接口的默认实现:

public class C1 : I1
{
    public long Id { get; set; }
    // 显式转发到接口默认方法
    public void SetId(long id) => ((IXProcRow)this).SetId(id);
}

之后就能直接调用t1.SetId(0),效果和方式一一致,同时C2的自定义实现不受影响。

验证说明

  • C2因为自己实现了SetId方法,所以直接用实例调用时,会优先执行类的实现,符合预期。
  • 两种方式都能在.NET 6和.NET 7环境下正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:24:57