以下代码有效.
byte b = 1;
Run Code Online (Sandbox Code Playgroud)
但我注意到以下代码不起作用
byte b = BooleanProperty ? 2 : 3; // error
Run Code Online (Sandbox Code Playgroud)
编译说
无法将源类型'int'转换为目标类型'byte'
我知道int类型不能隐式转换为字节类型.但是为什么前面的代码有效,后者则不然?
只要值在范围内,就会从int 常量(不仅是文字,但任何类型的编译时常量表达式int)进行隐式转换byte.这是来自C#5规范的第6.1.9节:
隐式常量表达式转换允许以下转换:
- 类型的常量表达式(§7.19)
int可以转换为类型sbyte,byte,short,ushort,uint,或ulong,所提供的常数表达式的值在目标类型的范围内.
但是,没有从类型的"一般"表达式隐式转换int为byte- 这就是你在第二种情况下得到的结果.它有点像这样:
int tmp = BooleanProperty ? 2 : 3;
byte b = tmp; // Not allowed
Run Code Online (Sandbox Code Playgroud)
请注意,条件表达式的使用在推断其类型时不起作用- 并且由于第二个和第三个操作数都是类型int,因此整体表达式也是类型int.
因此,如果您理解为什么上面我将代码分成两个语句的代码段不能编译,这就解释了为什么带有条件的单行版本也没有.
有两种方法可以修复它:
将第二个和第三个操作数更改为类型的表达式,byte以便条件表达式的总体类型为byte:
byte b = BooleanProperty ? (byte) 2 : (byte) 3;
Run Code Online (Sandbox Code Playgroud)转换条件表达式的结果:
byte b = (byte) (BooleanProperty ? 2 : 3);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |