Enum.HasFlag中出现意外结果

ne1*_*10s 2 c# enums .net-4.0

我最近在我的代码中遇到一个错误,我试图将枚举标志"拆除"到其组成值的数组中,但有时会返回意外的结果.

长话短说,分配给我的值的某些整数类型似乎会导致一些意外的行为(至少对我来说).我将问题归结为以下单元测试:

public enum TestEnum
{
    ITEM1 = 30104,
    ITEM2 = 30201,
}

[TestClass]
public class EnumFlagTest
{
    [TestMethod]
    public void SanityCheck()
    {
        var flag2 = TestEnum.ITEM2;

        Assert.IsFalse(flag2.HasFlag(TestEnum.ITEM1));
    }
}
Run Code Online (Sandbox Code Playgroud)

我没想到flag2会报告它"有旗帜" ITEM1,因为我不相信它.

我想这与我分配给项目的Int32值有关,但请有人解释一下发生了什么? - 为什么这个测试失败了?

Jon*_*eet 5

基本上,您不应该使用HasFlag非基于标志的枚举...并且基于标志的枚举应该为每个标志使用单独的位.

问题确实是因为价值观.用二进制文件写这个,你得到:

public enum TestEnum
{
    ITEM1 = 0b111010110011000,
    ITEM2 = 0b111010111111001
}
Run Code Online (Sandbox Code Playgroud)

注意如何设置的每个位ITEM1也设置在ITEM2- 这就是检查的内容HasFlag.从文档:

返回:

true如果设置的位字段或位字段flag也在当前实例中设置; 否则,false.

真的TestEnum.ITEM2.HasFlag(TestEnum.Item1),因此它返回true.