C# 为什么我的[Flag]枚举验证失败?

C# 为什么我的[Flag]枚举验证失败?,c#,validation,enums,bitflags,C#,Validation,Enums,Bitflags,我根本上误解了HasFlags的工作原理吗?我不明白为什么这个代码失败了 此代码获取一个值并确定它是否是我的枚举值的有效组合 枚举值的两个子组由ORing其他成员标识:仅月份和独占。仅在枚举中声明月份,在验证方法中构建独占项 当我将1或2(未分配或未知)传递给此方法时,它会正确地将它们标识为有效的独占项,而不是仅每月的成员 但当我将4传递给这个代码时,它正确地将它标识为整个集合的一个成员,但仅在几个月内错误地将它标识为子组的一个成员 我做错了什么?为什么我的代码认为4是(8 | 16 | 32

我根本上误解了HasFlags的工作原理吗?我不明白为什么这个代码失败了

此代码获取一个值并确定它是否是我的枚举值的有效组合

枚举值的两个子组由ORing其他成员标识:仅月份和独占。仅在枚举中声明月份,在验证方法中构建独占项

当我将1或2(未分配或未知)传递给此方法时,它会正确地将它们标识为有效的独占项,而不是仅每月的成员

但当我将4传递给这个代码时,它正确地将它标识为整个集合的一个成员,但仅在几个月内错误地将它标识为子组的一个成员

我做错了什么?为什么我的代码认为4是(8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048 | 4096 | 8172 | 16344)的成员


你的2的倍数不正确<代码>4086应该是
4096
8172
应该是
8192
,等等。

您的2的倍数不正确
4086
应该是
4096
8172
应该是
8192
,等等。

在@dukedukes的回答之后,问题是你的2的倍数被关闭了

避免此错误的一种方法是在右侧使用
按位
操作

[Flags]
enum Months
{
    January = 1 << 3, // 8
    February = 1 << 4, // 16
    March = 1 << 5, // 32
}
[标志]
枚举月份
{

一月=1在@dukedukes的回答之后,问题是你的2的倍数是错的

避免此错误的一种方法是在右侧使用
按位
操作

[Flags]
enum Months
{
    January = 1 << 3, // 8
    February = 1 << 4, // 16
    March = 1 << 5, // 32
}
[标志]
枚举月份
{

1月=1为了避免这种错误,使用2的幂。例如:
Unassigned=2^0,Unknown=2^1,notapplicative=2^2,Jan=2^3,Feb=2^4,
…上帝。我怎么会错过呢。谢谢!不要在深夜做我自己的数学了…@kurakura88,好主意。@kurakurakurakura88 C没有运算符的幂;你建议的(“^”)是一个位运算符。你给了我一个很好的微妙错误,这需要一些解。需要使用Math.Pow static方法。你可能想编辑你的答案,我刚刚愉快地将其复制到我的代码中:-)@kurakura88对不起,应该是“微妙错误”后面的笑脸句子。我决不想拒绝你的帮助。但调试那个位运算符很有趣,编译器很高兴有它。:-)很抱歉让你困惑。是的,请使用Dennis提到的按位做两次幂。我醉醺醺地键入了。:P(如果你愿意,StackOverflow只允许我删除我的注释).这篇评论不是为了回答问题,因为我不想抢走杜克公爵的聚光灯。为了避免这种错误,请使用2的幂。例如:
Unassigned=2^0,Unknown=2^1,notapplicative=2^2,Jan=2^3,Feb=2^4,
…上帝。我怎么会错过呢。谢谢!不要在深夜做我自己的数学了…@kurakurakura88,好主意。@kurakura88 C#没有PowerOf运算符;你建议的(“^”)是一个位运算符。你给了我一个很好的微妙错误,这需要一些解卷。需要使用Math.Pow static方法。你可能想编辑你的答案,我刚刚愉快地将其复制到我的代码中:-)@kurakura88抱歉,应该是“尼斯微妙错误”之后的笑脸句子。我决不想拒绝你的帮助。但调试那个位运算符很有趣,编译器很高兴有它。:-)很抱歉让你困惑。是的,请使用Dennis提到的按位做两次幂。我醉醺醺地键入了。:P(如果你愿意,StackOverflow只允许我删除我的注释)。评论不是为了回答问题,因为我不想抢走dukedukes的聚光灯。你的意思是
1@zerkms,是的。我这样做了。谢谢。我有一段时间没有使用该模式了。你的意思是
1@zerkms,是的。我这样做了。谢谢。我有一段时间没有使用该模式了。From:…以二的幂定义枚举常量,即1、2、4、8和依此类推。这意味着组合枚举常量中的各个标志不重叠。@m-y-Um,否。编译器在没有显式值的情况下分配
0,1,2,3,4,
flags
属性不会改变此行为。@KennethK.:I stand corrected,您是正确的。From:…定义枚举常量的幂为两个,即1、2、4、8等等。这意味着组合枚举常量中的各个标志不重叠。@m-y嗯,不。编译器在没有显式值的情况下分配
0、1、2、3、4,…
flags
属性不会改变此行为。@KennethK.:I stand corrected,you's corrected。