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

为何泛型接口协变(out关键字)无法正常工作?

协变(out关键字)的正确用法

你的代码问题出在对协变的理解偏差上——协变不是让你在实现接口时随意修改返回类型,而是允许接口实例的向上转换。

错误原因

当你的类实现IMyInterface<object>时,接口要求Foo方法返回object类型,你直接返回string属于方法签名不匹配,C#不允许这样做。协变的作用不是在这里体现的。

正确写法

首先让类实现对应返回类型的泛型接口,再利用协变进行类型转换:

public interface IMyInterface<out T>
{
    T Foo();
}

// 实现针对string的接口,返回类型严格匹配
public class CovarianceTest : IMyInterface<string>
{
    public string Foo()
    {
        return "abc";
    }
}

// 协变的实际应用场景
class Program
{
    static void Main()
    {
        // 核心:IMyInterface<string>可以隐式转换为IMyInterface<object>
        // 这就是out关键字带来的协变能力——用更派生的类型(string)替代基类型(object)
        IMyInterface<object> objInterface = new CovarianceTest();
        object result = objInterface.Foo(); // 实际拿到的是"abc",类型被向上转换为object
    }
}

协变的核心规则

  • out关键字限定泛型参数只能作为方法的返回值(不能作为输入参数的类型)
  • 如果TDerived是TBase的子类,那么IMyInterface<TDerived>可以隐式转换为IMyInterface<TBase>——这才是协变允许的"使用更派生类型"的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:25:41