C#字节类型和文字

以下代码有效。

byte b = 1; 

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

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

编译说

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

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

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

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

  • 如果constant-expression的值在目标类型的范围内,则int类型的常量表达式(第7.19节)可以转换为类型为sbytebyteshortushortuintulong

但是,没有从int类型的“常规”表达式到byte的隐式转换 – 这就是你在第二种情况下得到的。 有点像这样:

 int tmp = BooleanProperty ? 2 : 3; byte b = tmp; // Not allowed 

请注意,条件表达式的使用在推断其类型时不起作用 – 并且由于第二个和第三个操作数都是int类型,因此整个表达式也是int类型。

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

有两种方法可以修复它:

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

     byte b = BooleanProperty ? (byte) 2 : (byte) 3; 
  • 转换条件表达式的结果

     byte b = (byte) (BooleanProperty ? 2 : 3); 

说到C#中的字面整数 。

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

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