gpt4 book ai didi

c# - 难道真的不能垂头丧气吗?它对我来说很好用

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:14 24 4
gpt4 key购买 nike

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

在下面的链接中,人们提到向下转型是不可能的 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;
}

最佳答案

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

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

例如,这很好:

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

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

很好:

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

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

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

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

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

参见 "Casting and type conversions"在 MSDN 中获取更多信息。


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

object x = new MemoryStream();
Stream y = (Stream) x; // Stream is in the type hierarchy of MemoryStream

关于c# - 难道真的不能垂头丧气吗?它对我来说很好用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17956475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com