如何在 C# 中正确键入带有泛型的嵌套类

问题描述 投票:0回答:1

我正在尝试获取此 Kotlin 代码的 C# 等效项:

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

    }

}

这是有效的,因为

U
中的
Bar
T
中的
Foo
相同,因此与
E
中的
Baz
相同。

请记住,

Bar
是一个嵌套类,而不是内部类,因此,如果
Bar
没有通用的
toto
,它就无法拥有
U
的类型。

然后我尝试在 C# 中复制它,如下所示:

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;
        }
    }
}

但是,通过此实现,我收到错误

Cannot convert source type 'U' to target type 'T'

为什么它不起作用以及如何修复它?

c# generics inner-classes
1个回答
1
投票

但是,通过此实现,我收到错误无法将源类型“U”转换为目标类型“T”。

只需删除

U
,因为
Bar<U>
已经比
T
中的
Foo<T>
通用:

这为我编译:

public class Foo<T>
{
    public readonly T Toto;

    public Foo(T toto)
    {
        this.Toto = toto;
    }

    public class Bar : Foo<T>
    {
        public readonly T Tata;

        public Bar(T toto)
            : base( toto )
        {
            this.Tata = toto;
        }
    }
}

如果您想允许

Bar
有自己的类型参数并绑定到
T
,这也是可行的(但在我看来,实用性值得怀疑):

public class Foo<T>
{
    public readonly T Toto;

    public Foo( T toto )
    {
        Toto = toto;
    }

    public class Bar<U> : Foo<T>
        where U : T
    {
        public readonly U Tata;

        public Bar( U toto )
            : base( toto )
        {
            this.Tata = toto;
        }
    }
}

请注意,为了使用

Bar<U>
,您需要将其限定为
Foo<T>.Bar<U>
:

Foo<T> foo = new Foo<T>.Bar<U>( ... );
© www.soinside.com 2019 - 2024. All rights reserved.