重新构建两种类型共享公共基类型

时间:2015-10-19 14:23:41

标签: c# casting

我们有一些代码如下:

    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
    }

检查Toriginal是否共享最大公共基类型(在本例中为Base)的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您正在尝试将实例A强制转换为B,因为它们不是同一类型,A派生自B }}

无法将A投射到B。你可以做Recast<Base>(a),但这没有意义。请注意,您实际上并没有以任何方式更改类型,只是返回B的新实例,或者抛出异常。