我必须做一些非常愚蠢的事情,但我看不清楚是什么。在一个简单的控制台应用程序中,我有;
[Flags]
public enum ConsoleStates : byte
{
TopLevel,
All,
MainMenu,
SingleLeagueSelected,
}
然后
public class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.StartUp(args);
}
private bool CheckFlag(ConsoleStates targetVal, ConsoleStates checkVal)
{
return ((targetVal & checkVal) == checkVal);
}
private void StartUp(string[] args)
{
int x = 0;
ConsoleStates states = (ConsoleStates.All | ConsoleStates.MainMenu);
if (CheckFlag(states, ConsoleStates.SingleLeagueSelected))
{
x++;
}
}
}
我的问题X最后应该为零,但它始终为1.据我所知,它应该做一些明智的操作,并检查是否有单一的候选,并返回false。
这很奇怪,我所有的谷歌搜索说这很简单,只是有效,但对于我的生活,我无法得到它。 /感到羞耻。
答案 0 :(得分:5)
枚举默认值为0,1,2,3,...添加FlagsAttribute的AFAIK不会改变这一点。 我认为你需要明确设置你想要的值,例如:
[Flags]
public enum ConsoleStates : byte
{
TopLevel = 0,
All = 1,
MainMenu = 2,
SingleLeagueSelected = 4,
}
答案 1 :(得分:2)
您的枚举从0开始连续编号。要使用位标志,您需要手动将它们编号为2的幂。
答案 2 :(得分:1)
如果您使用的是.NET 4.0,则可以使用Enum.HasFlag()
方法检查枚举是否包含特定的位值。请参阅this问题中的答案。