2012-06-23 55 views
4

我有一個enum管理枚舉場

public enum Enumeration 
{ 
    A, 
    B, 
    C 
} 

而這需要Enumeration類型的一個參數的方法:

public void method(Enumeration e) 
{ 
} 

我想要method只能接受ABC被認爲是錯誤的值),但我需要C在我的Enumeration,因爲其他方法可以接受它作爲正確的價值。做這個的最好方式是什麼?

+2

您可能會感興趣的是這樣的:在C#中枚舉子集(HTTP:// trystans。 blogspot.com/2011/01/enum-subsets-in-c.html) – paulsm4

回答

6

我不會拒絕只是C。我會拒絕AB以外的任何值:

if (e != Enumeration.A && e != Enumeration.B) 
{ 
    throw new ArgumentOutOfRangeException("e"); 
} 

這是很重要的,否則人們可以撥打電話:

Method((Enumeration) -1); 

,它會通過您的驗證。你總是需要知道一個枚舉實際上只是一組命名整數 - 但是任何整數的正確基礎類型可以轉換爲枚舉類型。

+0

爲什麼使用'ArgumentOutOfRangeException'而不是'ArgumentException'? – gliderkite

+2

@gliderkite:因爲它適合,我會說。正如例外情況說明所述,它「超出允許範圍」。請注意,'ArgumentOutOfRangeException'擴展了'ArgumentException',所以它仍然是'ArgumentException'。 –

5

拋出一個異常:

public void method(Enumeration e) 
{ 
    if (e != Enumeration.A && e != Enumeration.B) { 
     throw new ArgumentOutOfRangeException("e"); 
    } 
    // ... 
} 

如果您使用的是.NET 4.0或更高版本,那麼你可以使用code contracts

+0

注意:'Contract'僅適用於.NET Framework 4或更高版本。 – gliderkite

+0

這是一個有點奇怪的比較,爲什麼不簡單地使用'!='? –

+0

@EdS .:我認爲閱讀「不是(a或b)」比「不是a而不是b」更容易,但如果你關心它,我可以改變它。 –

1

正如paulsm4提到的,你可以定義:

public enum EnumSubset 
{ 
    A = Enumeration.A, 
    B = Enumeration.B, 
} 

及用途:

public void method(EnumSubset e) 
{ 
}