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节)可以转换为类型为sbyte
,byte
,short
,ushort
,uint
或ulong
。
但是,没有从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;
文字符合字节类型。 但是在条件(三元)算子的情况下,弄清楚它是不够聪明的?:
。