我知道已经有发布与此相关的同一主题的一些问题,但我已经看到了不同的答案让我相当困惑哪个答案是正确的。
在下面的链接,人们提到,向下转换是不可能的转换/施放基类型派生类型
虽然下面这个链接,人们提到,向下转换才可能派生类是基类的一个实例, 垂头丧气,并上溯造型
我做了一个小实验,用直接铸造,例如实施了一个小型项目(C#)的向下转换:DerivedClass DC =(DerivedClass)基类,而不检查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;
}
向下转换是不可能的,当对象其实不是你想转换为类型的实例-如果它只是基类的一个实例。
这是可能的,当它的派生类已经1的一个实例。
例如,这是好的:
object x = "hello";
string y = (string) x;
这里的值x
是的实例的引用string
,所以向下转换到string
是好的。
这不是罚款:
object x = new object();
string y = (string) x; // Bang!
这里的值x
是的实例的引用object
,所以转换失败。
编辑:现在你已经包含在问题的代码就像是我的第二个例子-你刚刚创建的实例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
向下转换是可能的,如果你确定你的类型,这工作得很好:
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