【问题标题】:Why do I need an extra cast when using the conditional operator? [duplicate]为什么在使用条件运算符时需要额外的演员表? [复制]
【发布时间】:2016-09-28 06:40:30
【问题描述】:

在 C# 中,我可以将一个数字(最多 255)直接分配给字节类型的变量:

byte red = 255;

但是,如果我使用条件运算符在更复杂的语句中执行此操作:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : 255;

我收到一个错误:“CS0266 无法将类型 'int' 隐式转换为 'byte'。存在显式转换(您是否缺少强制转换?)”。

我需要明确地将 255 转换为字节:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : (byte)255;

为什么需要这个演员表?

【问题讨论】:

  • 因为 if else 都应该返回相同类型的实例
  • 没有从 int 到 byte 的隐式转换,但有一个显式转换。它被命名为“显式”是有原因的——你需要明确地应用它:)

标签: c# casting conditional-operator


【解决方案1】:

C# 中的数字文字是 int,而不是 byte。试试0xff

no implicit conversion from int to byte,第一个语句byte red = 255; 是一个特例。

int 类型的常量表达式可以转换为 sbyte、byte、 short、ushort、uint 或 ulong,提供常量的值 表达式在目标类型的范围内。

这并不能解释为什么它不转换第二个表达式中的常量 255,是吗?

不需要在第二个表达式中转换 255,因为there is an implicit conversion from byte to int。所以byte.Parse(redNode.Value) 被转换为int。所以(redNode != null) ? byte.Parse(redNode.Value) : 255; 的类型是int - 因为它不是一个常量表达式,所以不再隐式转换为byte

您认为错误消息要求您这样做:

byte red = (redNode != null) ? byte.Parse(redNode.Value) : (byte)255;

但它确实要求你这样做:

byte red = (byte)((redNode != null) ? byte.Parse(redNode.Value) : 255);

【讨论】:

  • 问题的关键是为什么它在这种情况下不起作用但在直接分配时起作用。
  • 但是为什么和第一次作业不一样呢?
  • @stefan.s웃 稍微扩展了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
相关资源
最近更新 更多