为何无法以返回具体类型实现返回接口的接口方法?
为什么实现接口方法时不能返回子类类型?
先看你给出的代码:
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
相关产品推荐
相关产品推荐

