MSDN page for byte表示你可以声明一个这样的字节:
byte myByte = 255;
那个
在前面的声明中,整数文字255是隐式的 从int转换为byte。如果整数文字超出范围 字节,将发生编译错误。
所以我很难理解为什么以下给我一个编译错误''不能隐式地将类型'int'转换为'byte')
byte value = on ? 1 : 0; // on is defined as a bool earlier
我在VS 2012上将其编译为Windows Store App项目,如果这有任何区别的话。
答案 0 :(得分:7)
因为:
on ? 1 : 0
不是整数 literal 。它是一个返回整数的表达式。而且,直到运行时才能评估此表达式。
当有文字时,编译器可以在编译时对其进行评估,并确保它满足任何范围要求 - 正如页面所说,如果值超出范围,则由编译器产生错误。
来自同一个page:
您不能隐式地将较大存储大小的非文字数字类型转换为字节。
Per @Jeppe Stig Nielsen的评论 - 如果值是常量,它也可以工作(它不必像第一页所说的那样是文字)。 C#规范说:
6.1.9隐式常量表达式转换
隐式常量表达式转换允许以下转换:
一个 类型
int
的常量表达式(第7.19节)可以转换为类型sbyte
,byte
,short
,ushort
,uint
或ulong
,提供了 constant-expression在目标类型的范围内。一个 类型
long
的常量表达式可以转换为类型ulong
, 如果常量表达式的值不是负数。