为何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
相关产品推荐
相关产品推荐

