2

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

在下面的链接中,人们提到无法向下 转换将基类型转换/转换为派生类型

虽然在下面的这个链接上,人们提到只有当派生类是基类 向下转换和向上转换的实例时,向下转换才是可能的

我做了一个小实验,并使用直接转换在一个迷你项目(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;
}
4

2 回答 2

11

当对象实际上不是您要转换为的类型的实例时,向下转换是不可能的——如果它只是基类的一个实例。

当它已经是派生类的实例时是可能的1

例如,这很好:

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

这里的值x是对 的实例的引用string,所以向下转换到string是可以的。

不好

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

这里的值x是对 的实例的引用object,因此强制转换失败。

编辑:您现在包含在问题中的代码就像我的第二个示例一样-您正在创建 just 的实例Order并尝试将其强制转换为PurchaseOrder. 那行不通-它不是PurchaseOrder. 但是,如果您像这样更改它:

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

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

有关详细信息,请参阅MSDN 中的“强制转换和类型转换”


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

object x = new MemoryStream();
Stream y = (Stream) x; // Stream is in the type hierarchy of MemoryStream
于 2013-07-30T20:15:00.183 回答
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
于 2013-07-30T20:14:47.467 回答