常量值无法转换为 int
Constant value cannot be converted to int
我不明白为什么第 5 行编译失败而第 4 行没问题。
static void Main(string[] args)
{
byte b = 0;
int i = (int)(0xffffff00 | b); // ok
int j = (int)(0xffffff00 | (byte)0); // error: Constant value cannot be converted to a 'int' (use 'unchecked' syntax to override)
}
基本上,编译时常量的检查方式与其他代码不同。
将编译时常量转换为范围不包含该值的类型将始终失败,除非您显式 具有unchecked
表达式。转换在编译时进行评估。
但是,分类为 value(而不是常量)的表达式的转换在执行时进行评估,并处理溢出或者异常(在检查中代码)或截断位(在未经检查的代码中)。
使用 byte
和 const
字段与 static readonly
字段相比,您可以更轻松地看到这一点:
class Test
{
static readonly int NotConstant = 256;
const int Constant = 256;
static void Main(string[] args)
{
byte okay = (byte) NotConstant;
byte fail = (byte) Constant; // Error; needs unchecked
}
}
我不明白为什么第 5 行编译失败而第 4 行没问题。
static void Main(string[] args)
{
byte b = 0;
int i = (int)(0xffffff00 | b); // ok
int j = (int)(0xffffff00 | (byte)0); // error: Constant value cannot be converted to a 'int' (use 'unchecked' syntax to override)
}
基本上,编译时常量的检查方式与其他代码不同。
将编译时常量转换为范围不包含该值的类型将始终失败,除非您显式 具有unchecked
表达式。转换在编译时进行评估。
但是,分类为 value(而不是常量)的表达式的转换在执行时进行评估,并处理溢出或者异常(在检查中代码)或截断位(在未经检查的代码中)。
使用 byte
和 const
字段与 static readonly
字段相比,您可以更轻松地看到这一点:
class Test
{
static readonly int NotConstant = 256;
const int Constant = 256;
static void Main(string[] args)
{
byte okay = (byte) NotConstant;
byte fail = (byte) Constant; // Error; needs unchecked
}
}