[英]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]
,因為我懷疑您所做的任何事情都可以同時成為Basic
和Pro
。 如果您嘗試使用標志來簡化測試枚舉值,則只需使用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.