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

时间:2015-10-14 10:55:00

标签: c# .net enums bitwise-operators

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

Test.All生成为按位的标志,无论稍后会在Test添加多少个值?例如,如果添加了新值:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

将对此枚举的所有成员求值为true(即使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);