在代码中做一些更改我使用下一行:
uint a = b == c ? 0 : 1;
Visual Studio向我显示了以下错误:
无法将类型"int"隐式转换为"uint".存在显式转换(是否缺少演员阵容?)
但如果我使用代码:
uint a;
if (b == c)
a = 0;
else
a = 1;
它工作正常,没有任何错误或警告.为什么?
在代码中做一些更改我使用下一行:
uint a = b == c ? 0 : 1;
Visual Studio向我显示了以下错误:
无法将类型"int"隐式转换为"uint".存在显式转换(是否缺少演员阵容?)
但如果我使用代码:
uint a;
if (b == c)
a = 0;
else
a = 1;
它工作正常,没有任何错误或警告.为什么?
为什么我不能用
uint a = b == c ? 0 : 1;
?
表达式b == c ? 0 : 1
的类型是int
.如this table中所示,不存在从int
到uint
的隐式转换,因此这是不允许的.
为什么我可以用
a = 0
?
因为当值是常量表达式时,对数值类型有特殊处理.
根据C#规范第6.1.9节:
int类型的常量表达式可以转换为sbyte、byte、short、ushort、uint或ulong类型,前提是常量表达式的值在目标类型的范围内.
如果常量表达式的值不为负值,则可以将类型为long的常量表达式转换为类型ulong.
如第一个项目符号a = 0
和a = 1
所示,因为0
和1
是常量表达式并且是有效的uint
值,所以两者都是允许的.基本上,这归结为编译器可以在编译时很容易地确定这些转换是有效的,因此它允许它们.
顺便说一句,如果第一个示例中的b == c
部分被更改为常量表达式(例如true
),那么整个条件运算符表达式将是常量表达式,并且代码将被编译.