Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将枚举值声明为~0是否会生成一个';s(按位)?_C#_.net_Enums_Bitwise Operators - Fatal编程技术网

C# 将枚举值声明为~0是否会生成一个';s(按位)?

C# 将枚举值声明为~0是否会生成一个';s(按位)?,c#,.net,enums,bitwise-operators,C#,.net,Enums,Bitwise Operators,是否保证Test.All将始终包括所有其他值?是的,按位,此枚举值将包括所有其他值。这意味着类似这样的测试: enum Test { X = 1, Y = 1 << 1, Z = 1 << 2, W = 1 << 3, WAndZ = W | Z, All = ~0 } 将对此枚举的所有成员计算为true(即使X的整数值为0) 同样,您可以(也应该)为0设置一个默认值,当与其他标志匹配时,该值将计算为false

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

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

enum Test
{
    X = 1,
    Y = 1 << 1,
    Z = 1 << 2,
    W = 1 << 3,
    WAndZ = W | Z,
    All = ~0
}
将对此枚举的所有成员计算为true(即使
X
的整数值为
0

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

(Test.All & Test.X) == Test.X
这意味着
All
将包括所有标志,
None
将不包括标志:

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

All
基本上等于设置了所有位的整数。我缺少什么吗?为什么不直接使用
-1
?旁白:虽然设置
None
作为无标志的标签很有用,但几乎肯定不希望
All
标志包含所有可能的值,甚至包括未分配的值。这是因为
All
的含义随着每个新标志的设计而有效地改变,对于从未编写过处理它的软件来说。@Rob-那更糟。@shay__;毫无疑问,它是有效的。这只是一种代码气味。例如,微软的BCL永远不会允许在公共API中存在这种不精确性。不过,他们有着极端的标准。
enum Test
{
    None = 0,     // no flags
    X = 1,
    Y = 2,
    Z = 4,
    ...
    All = ~0      // all flags
}
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);