常量值不能转换为int

时间:2015-03-13 17:21:10

标签: c# .net-4.5

我不明白为什么第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)
}

1 个答案:

答案 0 :(得分:6)

基本上,编译时常量与其他代码的检查方式不同。

将编译时常量转换为范围不包含该值的类型将始终失败,除非显式具有unchecked表达式。演员在编译时进行评估。

但是,在执行时评估被分类为(而不是常量)的表达式的强制转换,并通过异常(在已检查的代码中)或通过截断来处理溢出位(未经检查的代码)。

使用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
    }
}