我有一个带有flagsattribute的枚举,我用它来表示权限。我用它来比较if (CurrentPermissions & Permission1 == Permission1)
等......
[FlagsAttribute]
enum MyPermission
{
None = 0,
Permission1 = 1,
Permission2 = 2,
Permission3 = 4,
Permission4 = 8,...
..................
and so on
}
但是,我们达到了最大限度。一旦我用完枚举值,我可以使用-1,-2,-4等负值吗?
答案 0 :(得分:2)
您可以在Flags枚举中使用您喜欢的任何值定义条目。两个常见的是零和0xffffffff(-1),因为它们可以是有用的值来表示“禁用所有选项”和“启用所有选项”值,例如
enum DrawingOptions
{
None = 0,
DrawLines = 1 << 0,
FillShapes = 1 << 1,
Antialias = 1 << 2,
BestQuality = 0xffffffff
}
(如果添加新选项,任何启用“BestQuality”的代码都会自动启用该选项,因此您无需搜索代码即可更新所有内容)
然而,除了-1以外的负数不太可能非常有用,正如Frank Bollack已经回答的那样。
当枚举(byte,int32,int64)的大小发生变化时,您可能还需要非常小心负数。
答案 1 :(得分:1)
由于FlagsAttribue旨在将您的输入标记为位字段,因此使用负数将没有多大意义。查看二进制表示(对于int16):
1 -> 0000000000000001b
2 -> 0000000000000010b
4 -> 0000000000000100b
-1 -> 1111111111111111b
-2 -> 1111111111111110b
-4 -> 1111111111111100b
如您所见,负枚举值将表现为正值的按位组合。以int32作为枚举基础,您只有32个不同的值可用。因此,使用long(int64)作为枚举的基础,最多有64个值。
如果你超过这个数字,可能另一个数据结构更合适,例如枚举值列表。