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

如何在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;
        }
    }
}

错误原因

  1. Foo的构造参数类型错误:原Kotlin中Foo<T>的构造参数是Baz<T>类型,但C#版本里把构造参数和成员变量Toto都定义成了T类型,导致基类构造调用时类型不匹配。
  2. 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

相关产品推荐
方舟 Agent Plan

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

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