【发布时间】:2021-02-09 20:01:16
【问题描述】:
我有以下带有标志属性的枚举:
[Flags]
public enum MyEnum
{
None = 0,
First = 1,
Second= 2,
Third= 4,
.
.
.
Unknown = All >> 1,
All = ~None,
}
我希望Unknown 值是All 值之前的最后一个值。所以我认为右移运算符会完成这项工作,但是当我像这样将两个值打印到控制台时:
Console.WriteLine((int)MyEnum.All);
Console.WriteLine((int)MyEnum.Unknown);
它打印-1 和-1。
我在做什么错,如何修改代码以在 All 之前添加 Unknown?
编辑:感谢大家的回答,我忽略了右移运算符执行算术移位并“将符号位传播到高阶空位位置”。最后我意识到我的方法无论如何都会给我错误的结果,因为MyEnum.Unknown.HasFlag(MyEnum.First); 会返回true,那将是不正确的行为。这个answer 为我指明了正确的方向,我将Unknown 设置为int.MinValue,这正是我想要完成的——我希望Unknown 与任何其他值一样,并且也是可能的最高值。现在我只是很尴尬,我之前没有考虑过这个......
【问题讨论】:
-
From Right-shift operator >>: "如果左操作数的类型为
int或long,右移运算符执行算术 移位:值左侧操作数的最高有效位(符号位)被传播到高位空位位置。” -
为了完整起见,来自Enumeration types:“默认情况下,枚举成员的关联常量值为
int类型;它们从零开始,按照定义文本顺序加一。” -
Unknown = (int)unchecked(((uint)All) >> 1),
标签: c#