使用基类调用泛型不能从基类转换为T.

Mar*_*nix 5 c# generics

我有以下设置,似乎我的对象无法转换为泛型类型.虽然它实际上是基类.为什么这不起作用?这对我来说似乎很合乎逻辑.

public class AList<T> where T : A
{
    void DoStuff(T foo)
    {
    }

    void CallDoStuff()
    {
        DoStuff(new A()); // ERROR: Cannot convert A to T
    }
}

public class A
{
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 4

这里的问题是约束表明T必须是A 或 派生自 的类A
现在,当您AList使用具体类型实例化时,T它是一个非常具体的类。如果您没有实例化AList自身A,而是使用它的子类,T则 是 的子类A

您无法将具有基类运行时类型的实例转换为其子类之一,因为它会丢失子类添加的所有信息。

例子:

public class Animal
{
    public int Foo { get; set; }
}

public class Cat : Animal
{
    public int Bar { get; set; }
}

Derived d = new Base();
Run Code Online (Sandbox Code Playgroud)

您希望该代码能够工作吗?当然不是,因为 aCat也是 aAnimal但 aAnimal不是 a Cat
如果您希望上述代码实际工作,请问问自己执行以下代码时会发生什么:d.Bar = 42;
Animal不包含 的定义Bar

您的代码中也发生了同样的情况 - 只是游戏中的泛型更加模糊了一点。