C#泛型转换

3
我有一个无法解决的转型问题:
在ClassA的初始化函数中,我想将'this'作为参数传递,但编译器无法将>转换为, U>>,尽管它们是相同的(其中T:ClassB)。
public class ClassA<T, U> : MonoBehaviour where T : ClassB<U>
{
    public void initialize()
    {
        T item =...
        item.Initialize(this); // Cannot implicitly convert from ClassA<T, U> to ClassA<ClassB<U>, U>.
    }
}

public class ClassB<T> : MonoBehaviour
{
    public virtual void Initialize(ClassA<ClassB<T>, T> mgr, T data)
    {
        ...
    }
}

感谢。


2
你为什么认为可以从 ClassA<T, U> 转换为 ClassA<ClassB<U>, U>?泛型类是不变的。例如,你不能将 List<string> 强制转换为 List<object>。在这里也是同样的情况。 - Sweeper
可能重复:https://dev59.com/83I-5IYBdhLWcg3whImk#1817341 - Sweeper
好的,在 ClassA 的定义中,您有: "where T : ClassB<U>"。 - Grit
1
@Grit 这并不意味着“相同”,虽然它意味着任何一个T,无论它是什么或从ClassB<U>继承而来,都是被允许的。 - Marc Gravell
好的,我明白了。那么有没有办法说“T是ClassB<U>”呢?感谢大家的回复。 - Grit
显示剩余4条评论
2个回答

10
考虑以下情况:大象:动物;这并不意味着List<Elephant>:List<Animal>,您不能将List<Elephant>转换为List<Animal>,有很多原因(包括:那样会让你在将List<Elephant>转换为List<Animal>Add(monkey)List<Elephant>中,因为猴子:动物)。从概念上讲,这里完全相同。

我认为这应该添加到C#泛型类型的MSDN文档中。 - oleksa

0

这对类不起作用。它只有在 ClassB 是一个带有 out 类型参数的接口时才有效,如下所示:

public interface IInterfaceB<out T>
{
   …
}

然而,一个输出类型参数意味着你只能在你的IInterfaceB接口成员的返回值中使用类型参数T,而不能用于参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接