是不是真的倾向于不可能?它对我来说很好

时间:2013-07-30 20:11:27

标签: c# oop inheritance downcast

我知道已经发布了一些与此相同主题相关的问题,但我看到了不同的答案,所以我对哪个答案是正确的感到困惑。

在下面的链接中,人们提到无法进行向下转换 Convert/Cast base type to Derived type

在下面的链接中,人们提到只有在派生类是基类的实例时才可能进行向下转换 downcast and upcast

我做了一个小实验并使用直接投射在迷你项目(C#)上实现了向下转换,例如:DerivedClass dc =(DerivedClass)baseClass,而不检查DerivedClass是否是BaseClass的实例,令我惊讶的是,它工作正常,没有任何错误,所以为什么人们说转发是不可能的?

所以我的问题是,转发真的不可能吗?为什么人们似乎对这个话题有不同的答案?毕竟哪一个是真正的答案?有人可以更详细地解释一下吗?

示例代码:

public class Order {  }

public class PurchaseOrder : Order { // some new properties here for PurchaseOrder}

public static PurchaseOrder GetOrder()
{
    Order order = new Order();
    return (PurchaseOrder)order;
}

2 个答案:

答案 0 :(得分:8)

如果对象不是实际上您要转换为的类型的实例 - 如果它只是基类的一个实例,则无法进行向下转换。

,当它是已经 1 的派生类的实例时。

例如,这很好:

object x = "hello";
string y = (string) x;

此处x的值是对string实例的引用,因此向下转换为string即可。

罚款:

object x = new object();
string y = (string) x; // Bang!

此处x的值是对object实例的引用,因此转换失败。

编辑:您现在包含在问题中的代码就像我的第二个示例 - 您正在创建一个仅Order的实例,并尝试将其强制转换为{{1 }}。这不起作用 - 不是 PurchaseOrder。但是,如果你这样改变它:

PurchaseOrder

......没关系。 (这是奇怪的代码,但它有效。)

有关详细信息,请参阅MSDN中的"Casting and type conversions"


1 或者,如果您尝试转换为对象的实际类型层次结构中的某个其他接口或类。例如,这也没关系:

public static PurchaseOrder GetOrder()
{
    Order order = new PurchaseOrder();
    return (PurchaseOrder)order;
}

答案 1 :(得分:4)

如果您确定您的类型,可以进行向下转换,这样可以正常工作:

class Base {}
class Derived : Base {}

Base b = new Derived();
Derived d = (Derived) b;

这不起作用:

class Other : Base {}

Base b = new Other();
Derived d = (Derived) b; // InvalidCastException