簡體   English   中英

Enum.HasFlag應該返回什么?

[英]What is Enum.HasFlag supposed to return?

我有枚舉:

[Flags]
enum Editions
{
    Educational,
    Basic,
    Pro,
    Ultra
}

為什么會出現這種現象?

var x = Editions.Basic;
var y = Editions.Educational;
var test =x.HasFlag(y); // why is this true!?
// and!!!
var test2 = y.HasFlag(x); // this is false!

使用[Flags]屬性時,應將枚舉值顯式映射到包含非重疊位模式的整數。 也就是說,每個枚舉值都應映射為2的冪:

[Flags]
enum Editions
{
    Educational = 1,
    Basic = 2,
    Pro = 4,
    Ultra = 8
}

沒有顯式編號, Educational將映射為0, Basic將映射為1。

Enum.HasFlags檢查在參數中設置的一個或多個位字段是否也都在測試的枚舉中設置了。 在您的情況下, x為1, y為0。這意味着x包含設置為0所有位(完全沒有位)。 但是,在進行另一種測試時, 0不包含設置為1的位。

它返回true,因為您錯誤地實施了Editions 使用[Flags]屬性時,必須顯式設置值。

[Flags]
enum Editions
{                         //binary format
    Educational = 1 << 0, // 0001
    Basic  = 1 << 1,      // 0010
    Pro  = 1 << 2,        // 0100
    Ultra  = 1 << 3       // 1000
}

如果不分配數字,它將自動從0開始分配它們,然后為每個選項enum 1(這是標准enum行為,添加[Flags]屬性不會更改此行為)

[Flags]
enum Editions
{                    //binary format
    Educational = 0, // 0000
    Basic  = 1,      // 0001
    Pro  = 2,        // 0010
    Ultra  = 3       // 0011
}

因此,您進行的兩個測試是: 0001設置了標志0000 (這是真的,您沒有測試任何標志),而0000設置了標志0001 (絕對是錯誤的)


但是,看看您的名字,我懷疑您是否應該使用[Flags] ,因為我懷疑您所做的任何事情都可以同時成為BasicPro 如果您嘗試使用標志來簡化測試枚舉值,則只需使用switch語句即可

Editions edition = GetEdition();

switch(edition)
{
    case Editions.Basic:
         DoSomthingSpecialForBasic();
         break;

    case Editions.Pro:
    case Editions.Ultra:
        DoSomthingSpecialForProAndUltra();
        break;

    //Does not do anything if Editions.Educational
}

暫無
暫無

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

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