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
相关产品推荐
相关产品推荐

