[英]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.