我有以下设置,似乎我的对象无法转换为通用类型。虽然它实际上是基类。为什么这不起作用?这对我来说似乎很合乎逻辑。
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
{
}
最佳答案
这里的问题是约束说 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();
您希望该代码有效吗?当然不是,因为一个Cat
也是一个Animal
但是一个Animal
不是 Cat
.
如果您希望上面的代码真正起作用,请问问自己执行以下代码时会发生什么:d.Bar = 42;
Animal
不包含 Bar
的定义.
同样的情况也发生在您的代码中 - 只是游戏中的泛型更加模糊了一点。
关于c# - 使用基类调用泛型无法从基类转换为 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14934924/