可以将 2 的非幂值添加到带有标志的枚举中吗?

Okay to add non-power of 2 values to enum with flags?

在我下面的枚举中,我的意图是能够使用 Scheduled 来表示 'ILT | VILT | HVILT'。显然,在制作这种枚举的指南中,每个人都建议使用 2 的幂,但如果我的意思是 Scheduled 是其他值的组合,那么这应该没问题,对吧?

或者在执行此操作时有什么需要注意的地方吗?

[Flags]
public enum Modalities
{
    None = 0,
    ILT = 1,
    VILT = 2,
    HVILT = 4,
    Scheduled = 7,
    Online = 8,
    Package = 16,
    All = ~None
}

就功能而言,没有什么可担心的。

在可读性方面,您可能会考虑两个更改。

首先,我觉得 Scheduled = 7 不可读。在这种情况下,很简单,它包括 ILTVILTHVILT 标志。但有一天你可能会遇到需要使用更复杂的标志和数字,例如 173 并不那么容易立即分解。正确的方法是使用 Scheduled = ILT | VILT | HVILT

其次,我不喜欢双显式的打字能力。 Bitshift 运算符让您有机会对所有枚举值使用统一的表示法。

这里用一个例子来表达我自己的想法。

[Flags]
public enum Modalities
{
    None = 0,
    ILT = 1 << 0,
    VILT = 1 << 1,
    HVILT = 1 << 2,
    Online = 1 << 3,
    Package = 1 << 4,
    Scheduled = ILT | VILT | HVILT,
    All = ~None
}