C# 中的 const 字节字段按位 NOT

2024-03-19

我意识到,如果我有一个“byte”类型的字段或变量,我可以对其应用按位 NOT(~) 并将其转换为字节。但是,如果该字段是“const byte”,我仍然可以应用按位 NOT(~),但无法将其转换为字节。例如,

这编译:

class Program
{
    byte b = 7;
    void Method()
    {
        byte bb = (byte) ~b;
    }
}

但这有一个编译错误(“常量值'-8'无法转换为'字节'”):

class Program
{
    const byte b = 7;
    void Method()
    {
        byte bb = (byte) ~b;
    }
}

我想知道为什么?


因为~运算符仅预定义为int, uint, long, and ulong。您的第一个示例隐式转换b to an int,执行否定,然后显式转换回字节。

在第二个例子中,b是一个常量,因此编译器也会内联否定,有效地生成一个常量int值为 -8(7 的有符号补码)。并且由于恒定的负值不能转换为byte(不添加uncheckedcontext),你会得到一个编译错误。

为了避免错误,只需将结果存储在非常量中int多变的:

const byte b = 7;

void Main()
{
    int i = ~b;
    byte bb = (byte)i;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的 const 字节字段按位 NOT 的相关文章

随机推荐