假设我有这样一个enum:

[Flags]
enum Letters
{
     A = 1,
     B = 2,
     C = 4,
     AB = A | B,
     All = A | B | C,
}

为了检查AB是否被设置,我可以这样做:

if((letter & Letters.AB) == Letters.AB)

有没有一种比下面更简单的方法来检查是否设置了一个组合标志常量的任何标志?

if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)

例如,可以将&与其他东西交换吗?


当前回答

如果你想知道字母AB中是否有字母,你必须使用AND &运算符。喜欢的东西:

if ((letter & Letters.AB) != 0)
{
    // Some flag (A,B or both) is enabled
}
else
{
    // None of them are enabled
}

其他回答

如果你想知道字母AB中是否有字母,你必须使用AND &运算符。喜欢的东西:

if ((letter & Letters.AB) != 0)
{
    // Some flag (A,B or both) is enabled
}
else
{
    // None of them are enabled
}
if((int)letter != 0) { }

这对你有用吗?

if ((letter & (Letters.A | Letters.B)) != 0)

你可以检查这个值是否不为零。

if ((Int32)(letter & Letters.AB) != 0) { }

但是我认为引入一个值为0的新枚举值并与该枚举值进行比较是更好的解决方案(如果可能的话,因为您必须能够修改枚举)。

[Flags]
enum Letters
{
    None = 0,
    A    = 1,
    B    = 2,
    C    = 4,
    AB   =  A | B,
    All  = AB | C
}

if (letter != Letters.None) { }

更新

看错了问题——修正了第一个建议,忽略第二个建议。

如果可以使用。net 4或更高版本,请使用HasFlag()方法

例子

letter.HasFlag(Letters.A | Letters.B) // both A and B must be set

一样

letter.HasFlag(Letters.AB)