我正在尝试获取此 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'
。
为什么它不起作用以及如何修复它?
但是,通过此实现,我收到错误无法将源类型“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>( ... );