C#字节类型和文字

Shi*_*ure 2 c#

以下代码有效.

byte b = 1;
Run Code Online (Sandbox Code Playgroud)

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

byte b = BooleanProperty ? 2 : 3; // error
Run Code Online (Sandbox Code Playgroud)

编译说

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

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

Jon*_*eet 5

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

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

  • 类型的常量表达式(§7.19)int可以转换为类型sbyte,byte,short,ushort,uint,或ulong,所提供的常数表达式的值在目标类型的范围内.

但是,没有从类型的"一般"表达式隐式转换intbyte- 这就是你在第二种情况下得到的结果.它有点像这样:

int tmp = BooleanProperty ? 2 : 3;
byte b = tmp; // Not allowed
Run Code Online (Sandbox Code Playgroud)

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

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

有两种方法可以修复它: