请叫我水缸 2023-05-24 22:53 采纳率: 50%
浏览 16
已结题

C# 中as运算符的用法问题

【代码——】

img

【报错——】
CS0039:Cannot convert type 'Wen.Peach' to 'Wen.Apple' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion

【问题——】
不是说:运用as运算符,就算转换失败,也是返回null值吗?
为什么这段代码不可以,会直接报错?

(ps:但如果把【Peach p = new Peach ();】改为【Object p = new Peach ();】就会正常返回null值)

这是为什么?谢谢。

  • 写回答

3条回答 默认 最新

  • @晓码自在 2023-05-24 23:08
    关注

    该回答引用ChatGPT4与博主@晓码自在合作编写:

    你的疑问很好,as 运算符用于尝试进行类型转换,即使转换失败也会返回 null 而不报错。

    但是在你的代码中,as 运算符尝试将 Wen.Peach 类型转换为 Wen.Apple 类型,这两个类型没有继承关系,所以转换失败并报错。

    as 运算符可以在以下情况下成功转换并返回目标类型:

    1. 转换源类型和目标类型有继承关系
    2. 转换源类型可以向上转型为目标类型(如派生类到基类)
    3. 转换源类型实现了目标类型的接口

    在你的例子中,Wen.Peach 和 Wen.Apple 是两个独立的类型,不满足上述任意一条,所以转换失败并报 CS0039 错误。

    当你将 Wen.Peach 改为 Object 类型后,代码可以成功运行,因为:

    1. Wen.Peach 继承自 Object,满足可以向上转型为 Object
    2. 所以 as 运算符尝试将 Wen.Peach 转换为 Object 成功,并返回 Object 类型
    3. 然后判断对象 a 是否为 null,本例返回 null

    所以,as 运算符尝试进行类型转换,如果满足转换条件会返回目标类型,否则返回 null。但如果类型之间根本不满足任何转换条件,则会报类型转换错误,而不会返回 null。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月7日
  • 已采纳回答 5月30日
  • 创建了问题 5月24日

悬赏问题

  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式