我在下面有一个标志枚举。
[Flags]
public enum FlagTest
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4
}
我不能使if语句的计算结果为true。
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;
if (testItem == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
我如何才能实现这一点呢?
发布于 2009-11-20 19:04:36
在.NET 4中有一个新的方法Enum.HasFlag。这允许您编写以下代码:
if ( testItem.HasFlag( FlagTest.Flag1 ) )
{
// Do Stuff
}
它的可读性更好,IMO。
.NET源表明这与接受的答案执行相同的逻辑:
public Boolean HasFlag(Enum flag) {
if (!this.GetType().IsEquivalentTo(flag.GetType())) {
throw new ArgumentException(
Environment.GetResourceString(
"Argument_EnumTypeDoesNotMatch",
flag.GetType(),
this.GetType()));
}
ulong uFlag = ToUInt64(flag.GetValue());
ulong uThis = ToUInt64(GetValue());
// test predicate
return ((uThis & uFlag) == uFlag);
}
发布于 2008-09-02 18:31:53
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
// Do something
}
(testItem & FlagTest.Flag1)
是一个按位AND运算。
FlagTest.Flag1
等同于带有OP枚举的001
。现在假设testItem
有Flag1和Flag2 (所以它是按位101
):
001
&101
----
001 == FlagTest.Flag1
发布于 2009-11-20 19:12:51
对于那些难以可视化所接受的解决方案所发生的事情的人(这就是),
if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
// Do stuff.
}
testItem
(根据问题)被定义为,
testItem
= flag1 | flag2
= 001 | 010
= 011
然后,在if语句中,比较的左侧是,
(testItem & flag1)
= (011 & 001)
= 001
以及完整的if语句(如果在testItem
中设置了flag1
,则计算结果为true ),
(testItem & flag1) == flag1
= (001) == 001
= true
https://stackoverflow.com/questions/40211
复制相似问题