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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:59:57