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

Kotlin泛型in/out的C#等价写法及类型参数缺失报错解决

Kotlin泛型in/out对应的C#实现及错误解决

核心差异:Kotlin vs C#的泛型变异

Kotlin支持使用站点变异(即在使用泛型类型时直接用in/out限制类型参数的变异方向),而C#仅支持声明站点变异——必须在定义泛型类/接口时就指定类型参数的协变(out)或逆变(in)属性,不能在使用时临时添加in/out修饰符。

正确的C#实现步骤

1. 定义支持逆变的Bar类(对应Kotlin的Bar<in T>)

在C#中,用in修饰泛型类型参数实现逆变,意味着Bar<Parent>可以隐式转换为Bar<Child>:

public class Bar<in T>
{
    // 可添加接受T类型参数的方法(逆变类型参数仅能作为输入)
    public void Process(T item) { }
}

2. 定义支持协变的Baz类(对应Kotlin的Baz<out T>)

用out修饰泛型类型参数实现协变,意味着Baz<Child>可以隐式转换为Baz<Parent>:

public class Baz<out T>
{
    // 可添加返回T类型的方法(协变类型参数仅能作为输出)
    public T GetContent() => default;
}

3. 实现Foo类

此时使用Bar<T>和Baz<T>时,无需额外添加in/out修饰符:

public class Foo<T>
{
    public void Toto(Bar<T> arg)
    {
        // 方法逻辑
    }

    public void Tata(Baz<T> arg)
    {
        // 方法逻辑
    }
}

原代码报错原因

你写的Bar<in T>和Baz<out T>属于C#非法语法:in/out只能用于泛型类/接口的定义阶段,不能在使用泛型类型作为方法参数时直接标注,这就是编译器提示“Type argument is missing”错误的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:16