簡體   English   中英

Enum.HasFlag中出現意外結果

[英]Unexpected result in Enum.HasFlag

我最近在我的代碼中遇到了一個錯誤,我試圖將枚舉標志“拆除”到其組成值的數組中,但有時會返回意外的結果。

長話短說,分配給我的值的某些整數類型似乎會導致一些意外的行為(至少對我來說)。 我將問題歸結為以下單元測試:

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));
    }
}

我沒想到flag2會報告它“有ITEM1的旗幟”,因為我不相信它。

我想這與我分配給項目的Int32值有關,但請有人解釋一下發生了什么? - 為什么這個測試失敗了?

基本上,您不應該將HasFlag用於非基於標志的枚舉...並且基於標志的枚舉應該為每個標志使用單獨的位。

問題確實是因為價值觀。 用二進制文件寫這個,你得到:

public enum TestEnum
{
    ITEM1 = 0b111010110011000,
    ITEM2 = 0b111010111111001
}

注意ITEM1中設置的每個位如何也在ITEM2設置 - 這就是HasFlag檢查的HasFlag 文檔

返回:

如果在flag中設置的位字段或位字段也在當前實例中設置,則為true否則為true 否則, false

對於TestEnum.ITEM2.HasFlag(TestEnum.Item1) 也是如此,因此它返回true。

HasFlag方法是按位檢查, ITEM1的位與ITEM2匹配:

請注意, ITEM2包含與ITEM1相同的所有1

ITEM1: 111010110011000
ITEM2: 111010111111001

看起來你想要使用“位標志” - 一組容易合並的布爾值。

為此,每個標志需要設置一個位,並且該位需要位於唯一的位置。

但是將標志組合起來以涵蓋常見的分組是有效的。

我在StackOverflow上學到的一種技術是設置第一個標志,然后為其余的標志進行位移。 像這樣的東西:

[Flags]
enum color {
  none = 0,
  red = 1,                           // 0b0001
  yellow = red << 1,                 // 0b0010
  blue = yellow << 1,                // 0b0100

  primaries = red | yellow | blue,   // 0b0111  

  green = yellow | blue,             // 0b0110
  purple = red | blue,               // 0b0101
  orange = red | yellow              // 0b0011
}

有了這個,你可以

Assert.IsFalse(Color.green.HasFlag(color.red));
Assert.IsTrue(Color.primary.HasFlag(color.red));

我希望能為你解決問題!

  • 注意,這里的代碼主要是偽代碼; 可能存在語法錯誤。 然而,這個概念是合理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM