以下代码有效。
byte b = 1;
但我注意到以下代码不起作用
byte b = BooleanProperty ? 2 : 3; // error
编译器说
无法将源类型'int'转换为目标类型'byte'
我知道int类型不能隐式转换为字节类型。 但是为什么前面的代码有效,而后者却没有?
答案 0 :(得分:5)
从int
常量(不仅是文字,但任何类型int
的编译时常量表达式)到byte
的隐式转换,因为值在范围内。这来自C#5规范的第6.1.9节:
隐式常量表达式转换允许以下转换:
- 类型
int
的常量表达式(第7.19节)可以转换为sbyte
,byte
,short
,ushort
,{{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;
文字适合字节类型。但是在条件(三元)运算符?:
的情况下,它还不够聪明。