在 Enum foreach 语句中 HasFlag() 总是 returns true
HasFlag() always returns true in Enum foreach statement
感谢您抽出宝贵时间帮助我。
我 运行 遇到了一个相当奇怪的问题。我正在尝试遍历所有 Enum 值以检查我的对象是否包含 Enum 标志。但出于某种原因,我不太明白,在 foreach 中它说它总是有标志。但在单独的 if 语句中,它确实按照我想要的方式工作。但我不想重复代码 6 次,所以我想让 foreach 语句起作用。
有人知道发生了什么事吗?也许一些背景信息为什么会发生?
对不起我的英语,这不是我的母语。
提前致谢!
代码与原来的有所不同,但本质上是一样的。
下面的代码。
[Flags]
public enum SampleEnum
{
Enum1 = 0,
Enum2 = 1,
Enum3 = 2,
Enum4 = 4,
Enum5 = 8,
Enum6 = 16,
};
SampleEnum sample = SampleEnum.Enum1 | SampleEnum.Enum2;
// This doesn't work
foreach (SampleEnum enum in Enum.GetValues(typeof(SampleEnum)))
{
// This is statement says it allways has the flags. Even tho it doesn't have the flag.
if(sample.HasFlag(enum))
{
// This is always true.
}
}
// This works
if (sample.HasFlag(SampleEnum.Enum2))
{
// true
}
// This works
if (sample.HasFlag(SampleEnum.Enum3))
{
// false
}
// This works
if (sample.HasFlag(SampleEnum.Enum4))
{
// false
}
}
我似乎记得,当使用带 [Flags] 指令的 HasFlag 时,具有值为 0 的元素意味着所有内容都包含该元素。试试这个代码:
Enum.GetValues(typeof(MainSettings.ConnectedPrinters)).Cast<MainSettings.ConnectedPrinters>().Where(v => (int)v > 0).ToList())
这将迭代没有 0 值标志的列表。
来自 MSDN 关于 HasFlag
:
If the underlying value of flag is zero, the method returns true.
您应该在使用 HasFlag
之前检查零。
您永远不应创建值为 0 的 Flags 枚举,因为它会对元素与 0 进行按位比较。
AnyEnumItem & 0 始终等于 0。
编辑:"All item"
除外
感谢您抽出宝贵时间帮助我。
我 运行 遇到了一个相当奇怪的问题。我正在尝试遍历所有 Enum 值以检查我的对象是否包含 Enum 标志。但出于某种原因,我不太明白,在 foreach 中它说它总是有标志。但在单独的 if 语句中,它确实按照我想要的方式工作。但我不想重复代码 6 次,所以我想让 foreach 语句起作用。
有人知道发生了什么事吗?也许一些背景信息为什么会发生?
对不起我的英语,这不是我的母语。
提前致谢!
代码与原来的有所不同,但本质上是一样的。
下面的代码。
[Flags]
public enum SampleEnum
{
Enum1 = 0,
Enum2 = 1,
Enum3 = 2,
Enum4 = 4,
Enum5 = 8,
Enum6 = 16,
};
SampleEnum sample = SampleEnum.Enum1 | SampleEnum.Enum2;
// This doesn't work
foreach (SampleEnum enum in Enum.GetValues(typeof(SampleEnum)))
{
// This is statement says it allways has the flags. Even tho it doesn't have the flag.
if(sample.HasFlag(enum))
{
// This is always true.
}
}
// This works
if (sample.HasFlag(SampleEnum.Enum2))
{
// true
}
// This works
if (sample.HasFlag(SampleEnum.Enum3))
{
// false
}
// This works
if (sample.HasFlag(SampleEnum.Enum4))
{
// false
}
}
我似乎记得,当使用带 [Flags] 指令的 HasFlag 时,具有值为 0 的元素意味着所有内容都包含该元素。试试这个代码:
Enum.GetValues(typeof(MainSettings.ConnectedPrinters)).Cast<MainSettings.ConnectedPrinters>().Where(v => (int)v > 0).ToList())
这将迭代没有 0 值标志的列表。
来自 MSDN 关于 HasFlag
:
If the underlying value of flag is zero, the method returns true.
您应该在使用 HasFlag
之前检查零。
您永远不应创建值为 0 的 Flags 枚举,因为它会对元素与 0 进行按位比较。
AnyEnumItem & 0 始终等于 0。
编辑:"All item"
除外