我有枚举:
[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!
答案 0 :(得分:12)
使用[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
中设置的位。
答案 1 :(得分:6)
它返回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开始为每个选项后加1(这是标准的enum
行为,添加[Flags]
属性不会改变这种行为)
[Flags]
enum Editions
{ //binary format
Educational = 0, // 0000
Basic = 1, // 0001
Pro = 2, // 0010
Ultra = 3 // 0011
}
所以你做的两个测试是:0001
设置了标志0000
(这是真的,你没有测试任何标志)并且0000
有标志{{1 set(默认是假的)
然而,看看你的名字,我怀疑你应该使用0001
,因为我怀疑你在做什么,[Flags]
并且同时成为Basic
。如果您尝试使用标志来简化测试枚举值,则只需使用switch语句
Pro