.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
相关产品推荐
相关产品推荐

