C#字节类型和文字

时间:2015-07-04 20:46:20

标签: c#

以下代码有效。

byte b = 1;

但我注意到以下代码不起作用

byte b = BooleanProperty ? 2 : 3; // error

编译器说

  

无法将源类型'int'转换为目标类型'byte'

我知道int类型不能隐式转换为字节类型。 但是为什么前面的代码有效,而后者却没有?

2 个答案:

答案 0 :(得分:5)

int 常量(不仅是文字,但任何类型int的编译时常量表达式)到byte的隐式转换,因为值在范围内。这来自C#5规范的第6.1.9节:

  

隐式常量表达式转换允许以下转换:

     
      
  • 类型int的常量表达式(第7.19节)可以转换为sbytebyteshortushort,{{1}类型}},或uint,前提是constant-expression的值在目标类型的范围内。
  •   

但是,没有从ulong类型的“常规”表达式到int的隐式转换 - 这就是您在第二种情况下所获得的内容。它有点像这样:

byte

请注意,条件表达式的 use 在推断其类型时不起任何作用 - 并且第二个和第三个操作数的类型都为{{1 },整体表达式也是int tmp = BooleanProperty ? 2 : 3; byte b = tmp; // Not allowed 类型。

因此,如果您理解为什么上面我将代码分成两个语句的代码段无法编译,这就解释了为什么带有条件的单行版本也没有。

有两种方法可以解决它:

  • 将第二个和第三个操作数更改为int类型的表达式,以便条件表达式的整体类型为int

    byte
  • 投射条件表达式的结果

    byte

答案 1 :(得分:2)

说到C#中的literal integers

  

如果文字没有后缀,则它具有第一种类型   它的值可以表示为:int,uint,long,ulong。

编译器很聪明,可以推断出byte b = 1;文字适合字节类型。但是在条件(三元)运算符?:的情况下,它还不够聪明。