我有以下设置,似乎我的对象无法转换为泛型类型.虽然它实际上是基类.为什么这不起作用?这对我来说似乎很合乎逻辑.
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)
这里的问题是约束表明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。
您的代码中也发生了同样的情况 - 只是游戏中的泛型更加模糊了一点。