[英]What is Enum.HasFlag supposed to return?
我有枚举:
[Flags]
enum Editions
{
Educational,
Basic,
Pro,
Ultra
}
为什么会出现这种现象?
var x = Editions.Basic;
var y = Editions.Educational;
var test =x.HasFlag(y); // why is this true!?
// and!!!
var test2 = y.HasFlag(x); // this is false!
使用[Flags]
属性时,应将枚举值显式映射到包含非重叠位模式的整数。 也就是说,每个枚举值都应映射为2的幂:
[Flags]
enum Editions
{
Educational = 1,
Basic = 2,
Pro = 4,
Ultra = 8
}
没有显式编号, Educational
将映射为0, Basic
将映射为1。
Enum.HasFlags
检查在参数中设置的一个或多个位字段是否也都在测试的枚举中设置了。 在您的情况下, x
为1, y
为0。这意味着x
包含设置为0
所有位(完全没有位)。 但是,在进行另一种测试时, 0
不包含设置为1
的位。
它返回true,因为您错误地实施了Editions
。 使用[Flags]
属性时,必须显式设置值。
[Flags]
enum Editions
{ //binary format
Educational = 1 << 0, // 0001
Basic = 1 << 1, // 0010
Pro = 1 << 2, // 0100
Ultra = 1 << 3 // 1000
}
如果不分配数字,它将自动从0开始分配它们,然后为每个选项enum
1(这是标准enum
行为,添加[Flags]
属性不会更改此行为)
[Flags]
enum Editions
{ //binary format
Educational = 0, // 0000
Basic = 1, // 0001
Pro = 2, // 0010
Ultra = 3 // 0011
}
因此,您进行的两个测试是: 0001
设置了标志0000
(这是真的,您没有测试任何标志),而0000
设置了标志0001
(绝对是错误的)
但是,看看您的名字,我怀疑您是否应该使用[Flags]
,因为我怀疑您所做的任何事情都可以同时成为Basic
和Pro
。 如果您尝试使用标志来简化测试枚举值,则只需使用switch语句即可
Editions edition = GetEdition();
switch(edition)
{
case Editions.Basic:
DoSomthingSpecialForBasic();
break;
case Editions.Pro:
case Editions.Ultra:
DoSomthingSpecialForProAndUltra();
break;
//Does not do anything if Editions.Educational
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.