我可以使用枚举标志之间的空格来存储整数吗?我刚刚尝试过:
[Flags]
public enum Occupation : int
{
Open=16,
Flagged = 32,
Bomb = 64
}
我希望这会导致这样的枚举:
0b0 ... 0
0b1 ... 1
0b10 ... 2
.
.
0b1111 ... 15
0b10000 ... Open
0b10001 ... Open + 1
0b10010 ... Open + 2
.
.
0b011111 ... Open + 15
0b100000 ... Flagged
0b100001 ... Flagged + 1
.
0b101111 ... Flagged + 15
0b110000 ... Flagged, Open
0b110001 ... Flagged, Open + 1
,依此类推。我希望,枚举将忽略标志之间的值,但是如果我像这样对枚举进行位与运算,似乎它们都被设置为0(或无)。
Occupation occ = Occupation.Open; //initialize the enum with a Flag
occ += 8; //add 8 to the first bits of the enum without touching the Flags
Console.WriteLine((occ & (Occupation) 8 ).ToString());
//Expected Output: 8
//Actual Output: 0
根据this documentation,应该有可能在其中“存储一些值”(至少从整数转换时)。我是否真的必须从任何地方都将其强制转换为整数,或者有更好的方法来实现这一点?
答案 0 :(得分:0)
正如评论中的dlatikay一样,确实有可能在枚举中的Flags前面存储一个整数。我只是使用错误的整数来提取数字。由于这些标志始终是2的幂,因此提取的数字必须比第一个标志小。在此示例中,第一个Flag是16。因此,您可以在该枚举中存储最多15个数字,也可以使用15进行提取。
示例:
[Flags]
public enum MyEnum
{
FlagA = 16, //0b010000
FlagB = 32, //0b100000
}
.
.
MyEnum e = MyEnum.FlagA; //0b010000
e += 6; //0b010000 + 0b000110 EQUALS 0b010110
int x = (int)e & 15 //15=0b001111 AND e=0b010110 EQUALS 0b000110
Console.Write(x); //6
Console.WriteLine(e.HasFlag(MyEnum.A)); //true