2016-05-30 32 views
3

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

这是为什么投需要?

+0

因为两者如果其他人应该返回相同类型的实例 –

+0

那里不是从int到byte的隐式转换,而是明确的转换。由于某种原因,它被命名为“显式” - 您需要明确地应用它:) – Evk

回答

3

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

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

A constant expression of type int can be converted to sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant expression is within the range of the destination type.

这并不能解释为什么它不转换常数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); 
+0

问题的关键在于为什么它在这种情况下不起作用,但是在进行直接分配时起作用。 – ChrisF

+1

但是为什么它与第一个作业不同? –

+1

@ stefan.s웃扩大了答案。 – Peter

相关问题