检查枚举是否等于由枚举标志组成的枚举值

Check for Enum equals with Enum value composed from Enum flags

首先,我对这个标题感到非常抱歉,但(对我来说)想出一个合适的标题是不可能的。

问题如下,我有一个枚举,其中一个值由枚举的两个值的标志组成:

[Flags]
Enum TknType : byte
{
   Number = 0x01,
   Constant = 0x02,
   Numeric = Number | Constant, // 0x03
   BinaryOpr = 0x04,
   UnaryOpr = 0x05,
   Function = 0x06
   //and so on an so forth
}

我想检查一个标记是否为数字,但该标记要么是数字,要么是常量。 我该怎么做才能最好?

我在 dotnetfiddle 中厌倦了 HasFlags()Equals(),但是 none 这些工作。 HasFlags() returns 只有第一个值 Number。 这是我在 dotnetfiddle 运行 中的代码:

var tt = TknType.Number;
var tt2 = TknType.Const;
if (tt == TknType.Numeric)
{
   Console.WriteLine("tt isnumeric equals");
}
if (tt2 == TknType.Numeric)
{
   Console.WriteLine("tt2 isnumeric equals");
}
if (TknType.Numeric.HasFlag(tt))
{
   Console.WriteLine("tt isnumeric has flag");
}
if (TknType.Number.HasFlag(tt2))
{
   Console.WriteLine("tt2 isnumeric has flag");
}

输出是"tt isnumeric has flag"

我希望在检查 Numeric.

时,returns 对于 NumberConst 都为真

我想你正在寻找这个:

var test = TknType.Numeric;

if ((test & TknType.Numeric) == TknType.Numeric) 
{
    Console.WriteLine("Test has Numeric flag");
} 
else if ((test & TknType.Number) == TknType.Number) 
{
    Console.WriteLine("Test has Number flag");
}
else if ((test & TknType.Constant) == TknType.Constant) 
{
    Console.WriteLine("Test has Constant flag");
}