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

为何无法以返回具体类型实现返回接口的接口方法?

为什么实现接口方法时不能返回子类类型?

先看你给出的代码:

public interface J { }
public interface I { public J M(); }
public class D : J { }
public class C : I {
    public D M() { return new D(); }
}

编译报错的核心原因是C# 9.0之前的版本不支持协变返回类型,具体细节可以拆解为这几点:

  • 接口本质是一种契约,I接口明确规定M()方法必须返回J类型。当调用者通过I类型的实例调用M()时,编译器只会知晓返回值是J类型;早期C#要求实现类的方法签名必须和接口完全一致——包括返回类型,哪怕D是J的子类、类型兼容也不例外。
  • 这种严格匹配的设计是出于早期类型系统的简洁性和安全性考虑,当时的语言设计优先保证契约的严格执行,避免引入协变带来的类型检查复杂度。
  • 如果你想保留返回D的需求,有两种解决方式:
    • 升级到C# 9.0及以上版本:这个版本开始支持协变返回类型,你的代码可以直接编译通过。
    • 兼容旧版本:通过显式实现接口来满足契约,同时提供一个返回D的公共方法:
      public class C : I {
          J I.M() { return M(); }
          public D M() { return new D(); }
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:51:20