为什么不使用条件运算符从整数到字节的隐式转换?

时间:2012-09-11 14:06:39

标签: c# windows-runtime

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项目,如果这有任何区别的话。

1 个答案:

答案 0 :(得分:7)

因为:

on ? 1 : 0

不是整数 literal 。它是一个返回整数的表达式。而且,直到运行时才能评估此表达式。

当有文字时,编译器可以在编译时对其进行评估,并确保它满足任何范围要求 - 正如页面所说,如果值超出范围,则由编译器产生错误。

来自同一个page

  

您不能隐式地将较大存储大小的非文字数字类型转换为字节。


Per @Jeppe Stig Nielsen的评论 - 如果值是常量,它也可以工作(它不必像第一页所说的那样是文字)。 C#规范说:

  

6.1.9隐式常量表达式转换

     

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

     
      
  • 一个   类型int的常量表达式(第7.19节)可以转换为类型   sbytebyteshortushortuintulong,提供了   constant-expression在目标类型的范围内。

  •   
  • 一个   类型long的常量表达式可以转换为类型ulong,   如果常量表达式的值不是负数。

  •