You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Mask为const时,flags &= (ushort)~Mask会触发CS0221编译错误?

为何C#中const无符号整数取反后强制转换会触发CS0221错误?

以下代码会触发编译器错误CS0221:Constant value '-2' cannot be converted to a 'ushort' (use 'unchecked' syntax to override)

private ushort _fooFlags = 0;
public void SetFoo1Flag(bool foo)
{
    const ushort Foo1Mask = 0x0001;
    if (foo)
    {
        _fooFlags |= Foo1Mask;
    }
    else
    {
        _fooFlags &= (ushort)~Foo1Mask; // CS0221 error
    }
}

按照错误提示,使用unchecked代码块可以修复该问题:

private ushort _fooFlags = 0;
public void SetFoo1Flag(bool foo)
{
    const ushort Foo1Mask = 0x0001;
    if (foo)
    {
        _fooFlags |= Foo1Mask;
    }
    else
    {
        unchecked
        {
            _fooFlags &= (ushort)~Foo1Mask;
        }
    }
}

作为主要使用C语言的开发者,我尝试了几种写法来观察这类基础整数运算的表现:

移除const关键字后代码正常运行

public void SetFoo2Flag(bool foo)
{
    ushort Foo2Mask = 0x0001;
    if (foo)
    {
        _fooFlags |= Foo2Mask;
    }
    else
    {
        _fooFlags &= (ushort)~Foo2Mask;
    }
}

将const替换为readonly也可正常运行

private readonly ushort Foo3Mask= 0x0004;
public void SetFoo3Flag(bool foo)
{
    if (foo)
    {
        _fooFlags |= Foo3Mask;
    }
    else
    {
        _fooFlags &= (ushort)~Foo3Mask;
    }
}

我已经使用了显式强制转换,原本预期(ushort)~Foo1Mask会直接转换为ushort类型,无论~Foo1Mask的运算结果是什么。但为什么const的行为如此特殊,需要额外用unchecked处理,而另外两种类似写法却符合预期?

PS:我知道这个场景可以使用枚举和[Flags]特性,这里主要关注的是整数运算的行为差异。


内容的提问来源于stack exchange,提问作者Velvet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:01:29