C#中如何在接口中使用协变返回类型?
在C#中实现接口的协变返回类型
你的需求在C# 9.0及更高版本里完全能实现,靠协变返回类型特性就能搞定,调用Method后不用强制转换,直接就能访问具体类的专属方法。
直接用C#9+的协变返回
你给的代码结构几乎不用改,只要项目语言版本设为C#9或更高就行。完整可运行代码如下:
public interface Interface<T> { Interface<T> Method(); } public class ClassA : Interface<int> { public ClassA Method() { return new ClassA(); } // ClassA专属方法 public void DoSomethingA() { Console.WriteLine("ClassA的专属方法"); } } public class ClassB : Interface<string> { public ClassB Method() { return new ClassB(); } // ClassB专属方法 public void DoSomethingB() { Console.WriteLine("ClassB的专属方法"); } }
调用示例
直接用具体类实例调用,不用强制转换:
var a = new ClassA(); a.Method().DoSomethingA(); // 直接调用ClassA的方法 var b = new ClassB(); b.Method().DoSomethingB(); // 直接调用ClassB的方法
低版本C#的替代方案
如果没法升级到C#9+,可以用自引用泛型约束来实现一样的效果:
// 定义带自引用约束的泛型接口,限定实现类必须传入自身类型 public interface Interface<T, TSelf> where TSelf : Interface<T, TSelf> { TSelf Method(); } public class ClassA : Interface<int, ClassA> { public ClassA Method() { return new ClassA(); } public void DoSomethingA() { Console.WriteLine("ClassA的专属方法"); } } public class ClassB : Interface<string, ClassB> { public ClassB Method() { return new ClassB(); } public void DoSomethingB() { Console.WriteLine("ClassB的专属方法"); } }
这种写法在C#8及以下版本都能用,调用方式和上面完全一样,不用强制转换。
核心说明
- 协变返回类型允许实现类的方法返回比接口定义更具体的类型(也就是接口返回类型的派生类),完美匹配你的需求。
- 自引用泛型约束是低版本的妥协方案,虽然多了个泛型参数,但功能完全一致。
内容的提问来源于stack exchange,提问作者AndreaTrasacco
相关产品推荐
相关产品推荐

