为什么在使用条件运算符时需要额外的强制转换?

时间:2016-05-30 12:22:27

标签: c# casting conditional-operator

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

byte red = 255;

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

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

我收到错误:" CS0266无法隐式转换类型' int'到'字节'。存在显式转换(您是否错过了演员?)"。

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

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

为什么需要演员?

1 个答案:

答案 0 :(得分:3)

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);