将枚举值声明为 ~0 是否会生成一个标志(按位)?

Does declaring enum value as ~0 generates a flag of one's (bitwise)?

enum Test
{
    X = 1,
    Y = 1 << 1,
    Z = 1 << 2,
    All = ~0
}

是否会生成Test.All作为按位1的标志,无论在以后的时间点将多少值添加到Test?例如,如果添加新值:

enum Test
{
    X = 1,
    Y = 1 << 1,
    Z = 1 << 2,
    W = 1 << 3,
    WAndZ = W | Z,
    All = ~0
}

是否保证 Test.All 将始终包含所有其他值?

是的,按位,此枚举值将包括所有其他值。这意味着这样的测试:

(Test.All & Test.X) == Test.X

将对此枚举的所有成员计算为真(即使 X 的整数值为 0)。

同样,您可以(并且应该)为 0 设置一个默认值,当与其他标志匹配时,它的计算结果为 false:

enum Test
{
    None = 0,     // no flags
    X = 1,
    Y = 2,
    Z = 4,
    ...
    All = ~0      // all flags
}

这意味着 All 将包含所有标志,而 None 将不包含任何标志:

Debug.Assert((Test.All & Test.None) == Test.None);
Debug.Assert((Test.All & Test.X) == Test.X);
Debug.Assert((Test.All & Test.All) == Test.All);

Debug.Assert((Test.None & Test.None) == Test.None);
Debug.Assert((Test.None & Test.X) == Test.None);
Debug.Assert((Test.None & Test.All) == Test.None);