难道真的向下转换不可能? 它的工作对我罚款(Is it really downcasting n

2019-10-18 10:10发布

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

在下面的链接,人们提到,向下转换是不可能的转换/施放基类型派生类型

虽然下面这个链接,人们提到,向下转换才可能派生类是基类的一个实例, 垂头丧气,并上溯造型

我做了一个小实验,用直接铸造,例如实施了一个小型项目(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;
}

Answer 1:

向下转换是不可能的,当对象其实不是你想转换为类型的实例-如果它只是基类的一个实例。

可能的,当它的派生类已经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


Answer 2:

向下转换是可能的,如果你确定你的类型,这工作得很好:

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


文章来源: Is it really downcasting not possible? It is working fine for me