如何在C#中正确标注带泛型的嵌套类?Kotlin转译报错排查
Kotlin泛型嵌套类转C#的问题与修复
原Kotlin代码
这是需要转换的目标Kotlin代码,其中Bar是Foo的嵌套类,泛型U与Foo<U>的U、Baz<U>的U保持一致:
class Baz<E>(val value: E) class Foo<T>(val toto: Baz<T>) { class Bar<U>(toto: Baz<U>) : Foo<U>(toto) { val tata: U = toto.value } }
错误的C#实现
以下是尝试转换的C#代码,运行时会报错:Cannot convert source type 'U' to target type 'T'
public class Baz<E> { public E Value; public Baz(E value) { Value = value; } } public class Foo<T> { public T Toto; public Foo(T toto) { Toto = toto; } public class Bar<U> : Foo<U> { public U Tata; public Bar(U toto) : base(toto) { Tata = toto.Value; } } }
错误原因
- Foo
的构造参数类型错误 :原Kotlin中Foo<T>的构造参数是Baz<T>类型,但C#版本里把构造参数和成员变量Toto都定义成了T类型,导致基类构造调用时类型不匹配。 - Bar的构造参数类型错误:原Kotlin中
Bar<U>的构造参数是Baz<U>类型,但C#版本写成了U类型,此时toto.Value的写法本身不成立——U是泛型类型,并没有默认的Value属性,同时传给基类的参数类型也不符合Foo<U>的构造要求。
修复后的C#代码
修正两处类型错误后,代码可以正常运行:
public class Baz<E> { public E Value; public Baz(E value) { Value = value; } } public class Foo<T> { public Baz<T> Toto; public Foo(Baz<T> toto) { Toto = toto; } public class Bar<U> : Foo<U> { public U Tata; public Bar(Baz<U> toto) : base(toto) { Tata = toto.Value; } } }
修正说明
- 将
Foo<T>的构造参数和成员变量Toto的类型从T改为Baz<T>,与原Kotlin代码的定义对齐。 - 将
Bar<U>的构造参数类型从U改为Baz<U>,既满足基类Foo<U>的构造参数要求,也能通过toto.Value正确获取U类型的值赋值给Tata。
内容的提问来源于stack exchange,提问作者Vinccool96
相关产品推荐
相关产品推荐

