常量值无法转换为 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(而不是常量)的表达式的转换在执行时进行评估,并处理溢出或者异常(在检查中代码)或截断位(在未经检查的代码中)。

使用 byteconst 字段与 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
    }
}