枚举 - 所有选项的价值

Gil*_*tal 23 c# enums flags bit-manipulation

有没有办法在枚举中添加"所有值"选项而不必在每次将新值添加到枚举时更改其值?

[Flags] 
public enum SomeEnum
{
    SomeValue =  1,
    SomeValue2 = 1 << 1,
    SomeValue3 = 1 << 2,
    SomeValue4 = 1 << 3,
    All = ?
}
Run Code Online (Sandbox Code Playgroud)

更新:

结束从long继承并使用long.MaxValuefor All选项.

And*_*ren 35

因为您应该在标志枚举中定义空值,例如None = 0定义All值的最简单方法是简单地反转所有位None.

[Flags]
enum MyEnum
{
   None = 0,
   A = 1
   B = 2,
   C = 4,
   ...
   All = ~None
}
Run Code Online (Sandbox Code Playgroud)

请注意,~0而不是~None将不无符号后盾类型的工作,因为这是-1,这不是无符号的有效值

编辑:修改了答案以使用反转的None而不是显式常量,例如0x7FFFFFFF或~0,因为这也适用于unsigned

  • 我不同意`-1`,`0xFFFFFFFF`或`~0`解决方案.当你假设`All = -1`而不是`(SomeEnum.SomeValue | SomeEnum.SomeValue2 | SomeEnum.SomeValue3 | SomeEnum.SomeValue4).HasFlag(SomeEnum.All)`是假的.也许像"All =(SomeValue4 << 1) - 1"这样的东西可以提供帮助 (10认同)
  • 您还可以将`All`枚举的值设置为`~0`,这在功能上是相同的.我只是看到所有那些'F`在彼此旁边. (2认同)

Dmi*_*lov 14

它应该是这样的:

[Flags] 
public enum SomeEnum
{
    SomeValue =  1,
    SomeValue2 = 1 << 1,
    SomeValue3 = 1 << 2,
    SomeValue4 = 1 << 3,
    All = SomeValue | SomeValue2 | SomeValue3 | SomeValue4
}
Run Code Online (Sandbox Code Playgroud)

  • 我并不反对,但请注意OP明确要求免维护选项.但我有点同意,明确是最好的. (5认同)

Ask*_*ein 5

枚举可以由许多不同长度的整数类型(short、int、long)组成。这使得#FFFFFFFF解决方案不合适(如@MarcGravell 评论中指出的那样)。

枚举可以由无符号类型组成(对于 isntance 为 uint)。这使得-1解决方案不合适。

我最好的选择是免维护:

All = ~0
Run Code Online (Sandbox Code Playgroud)