2012-01-01 82 views
1

我有一個如果條件爲一個枚舉。我的枚舉是:如何使用標誌如果條件

public enum EmploymentType 
{ 
    Type1 = 1, 
    Type2 = 2, 
    Type3 = 3 
} 

並在此條件

EmploymentType type = EmploymentType.Type1 ; 

if (type.HasFlag(EmploymentType.Type1 | EmploymentType.Type2)) //if (type == (EmploymentType.Type1 | EmploymentType.Type2)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

預期的真實結果此條件,但結果是假的。爲什麼?

+0

爲什麼不呢,'如果(類型== EmploymentType.Type1 ||類型== EmploymentType.Type2)' – 2012-01-01 12:36:11

+1

請閱讀此:[枚舉標誌屬性](http://stackoverflow.com/questions/8447/enum-flags-attribute)。 – 2012-01-01 12:36:31

回答

3

有你做錯了幾件事情:

  • 您枚舉沒有[Flags]屬性。 HasFlags被設計爲僅與使用該屬性集的枚舉一起工作。

  • 你不遵循標誌約定。除非Type3Type1Type2的組合,它應該具有值4而不是3。請閱讀FlagsAttribute MSDN page中的文檔。

  • 你的期望是錯誤的:HasFlag(Flag1 | Flag2)只返回的真實標誌1和標誌2設置,既然你是按位OR -ing標誌1和標誌2,如果這些位被設置檢查。詳情請看HasFlag documentation

我懷疑你的枚舉,就是要只是標誌枚舉而不是容器。標誌應該是可組合的,即,類型可以是「Type1和Type2」或「無類型」或「所有類型」(如字體格式,可以是「無」,「粗體」,「斜體」以及「大膽和斜體「,」粗體和下劃線「等)。我認爲這不適用於你的情況。

因此,忘記標誌事物,只是使用常規枚舉匹配(如type == EmploymentType.Type1 || type == EmploymentType.Type2switch語句)而不是HasFlags方法。

1

您的枚舉沒有[Flags]屬性。

而且改變你的if語句

if (type.HasFlag(EmploymentType.Type1) || type.HasFlag(EmploymentType.Type2)) 
+1

枚舉值不是兩個冪,因此將它們作爲標誌處理將不起作用。 – hvd 2012-01-01 12:39:09

+2

除了'[Flags]'的編號應該是1,2,4,8,... – 2012-01-01 12:40:04

+0

對我來說,他似乎很奇怪他一般使用標誌(在if語句中),沒有注意到枚舉中的第三個值實際上不是4 ... – 2012-01-01 12:45:08

0

|並不意味着你所想象的那樣,這也許最左不明原因的現在。重要的是,以測試「如果A或B」,你可以使用if (a || b)

if (type == EmploymentType.Type1 || type == EmploymentType.Type2) 
{ 
    ... 
} 
1

當您使用[標誌]枚舉值必須在基地2(二進制)

 

    [Flags] 
    enum Days2 
    { 
     None = 0x0, 
     Sunday = 0x1, 
     Monday = 0x2, 
     Tuesday = 0x4, 
     Wednesday = 0x8, 
     Thursday = 0x10, 
     Friday = 0x20, 
     Saturday = 0x40 
    } 

    [Flags] 
    public enum Pet { 
     None = 0, 
     Dog = 1, 
     Cat = 2, 
     Bird = 4, 
     Rabbit = 8, 
     Other = 16 
    } 

+0

很想看到DogBirdRabbit;) – BlueChippy 2012-01-03 09:36:12