[英]Use Flags Enum space like an integer
我可以使用枚举标志之间的空格来存储整数吗? 我只是试过这个:
[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
根据本文档 ,应该可以在其中“存储一些值”(至少从整数中强制转换时)。 我是否真的必须从任何地方都将其强制转换为整数,还是有更好的方法来实现这一点?
正如评论中提到的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.