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

Sup*_*ing 1 c# oop inheritance downcast

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

在下面的链接中,人们提到转发不可能 转换/转换基类型为派生类型

在下面的链接中,人们提到只有当派生类是基类downcast和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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

当对象实际上不是您尝试转换为的类型的实例时,如果它只是基类的一个实例,则无法进行向下转换.

可能的,当它的派生类已实例1.

例如,这很好:

object x = "hello";
string y = (string) x;
Run Code Online (Sandbox Code Playgroud)

这里的值x是对实例的引用string,所以向下转换string就好了.

不好:

object x = new object();
string y = (string) x; // Bang!
Run Code Online (Sandbox Code Playgroud)

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

编辑:你现在包含在问题中的代码就像我的第二个例子 - 你正在创建一个just的实例Order并试图将其转换为PurchaseOrder.这不会奏效 - 它不是一个PurchaseOrder.但是,如果你这样改变它:

public static PurchaseOrder GetOrder()
{
    Order order = new PurchaseOrder();
    return (PurchaseOrder)order;
}
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅MSDN中的"转换和类型转换".


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

object x = new MemoryStream();
Stream y = (Stream) x; // Stream is in the type hierarchy of MemoryStream
Run Code Online (Sandbox Code Playgroud)

  • Hihi,即使你在Jon之前发帖,你也不会得到任何+ 1的:) (2认同)