我们有一些代码如下:
class Base
{
public string Name;
}
class DeeperBase : Base
{
}
class A : Base
{
public A()
{
Name = "A";
}
}
class B : DeeperBase
{
public B()
{
Name = "B";
}
}
static T Recast<T>(Base original) where T : Base, new()
{
if (!original.GetType().IsAssignableFrom(typeof(T)))
throw new InvalidCastException();
return new T();
}
看起来Recast
在返回新的T
之前试图检查这两种类型是否兼容。但是,对于以下代码,该方法失败。
public static void Main(string[] args)
{
var a = new A();
var b = Recast<B>(a); // exception
}
检查T
和original
是否共享最大公共基类型(在本例中为Base
)的正确方法是什么?
答案 0 :(得分:2)
您正在尝试将实例A
强制转换为B
,因为它们不是同一类型,A
派生自B
}}
无法将A
投射到B
。你可以做Recast<Base>(a)
,但这没有意义。请注意,您实际上并没有以任何方式更改类型,只是返回B
的新实例,或者抛出异常。