我有一個enum
:管理枚舉場
public enum Enumeration
{
A,
B,
C
}
而這需要Enumeration
類型的一個參數的方法:
public void method(Enumeration e)
{
}
我想要method
只能接受A
和B
(C
被認爲是錯誤的值),但我需要C
在我的Enumeration
,因爲其他方法可以接受它作爲正確的價值。做這個的最好方式是什麼?
我有一個enum
:管理枚舉場
public enum Enumeration
{
A,
B,
C
}
而這需要Enumeration
類型的一個參數的方法:
public void method(Enumeration e)
{
}
我想要method
只能接受A
和B
(C
被認爲是錯誤的值),但我需要C
在我的Enumeration
,因爲其他方法可以接受它作爲正確的價值。做這個的最好方式是什麼?
我不會拒絕只是C
。我會拒絕比A
和B
以外的任何值:
if (e != Enumeration.A && e != Enumeration.B)
{
throw new ArgumentOutOfRangeException("e");
}
這是很重要的,否則人們可以撥打電話:
Method((Enumeration) -1);
,它會通過您的驗證。你總是需要知道一個枚舉實際上只是一組命名整數 - 但是任何整數的正確基礎類型可以轉換爲枚舉類型。
爲什麼使用'ArgumentOutOfRangeException'而不是'ArgumentException'? – gliderkite
@gliderkite:因爲它適合,我會說。正如例外情況說明所述,它「超出允許範圍」。請注意,'ArgumentOutOfRangeException'擴展了'ArgumentException',所以它仍然是'ArgumentException'。 –
拋出一個異常:
public void method(Enumeration e)
{
if (e != Enumeration.A && e != Enumeration.B) {
throw new ArgumentOutOfRangeException("e");
}
// ...
}
如果您使用的是.NET 4.0或更高版本,那麼你可以使用code contracts。
注意:'Contract'僅適用於.NET Framework 4或更高版本。 – gliderkite
這是一個有點奇怪的比較,爲什麼不簡單地使用'!='? –
@EdS .:我認爲閱讀「不是(a或b)」比「不是a而不是b」更容易,但如果你關心它,我可以改變它。 –
正如paulsm4提到的,你可以定義:
public enum EnumSubset
{
A = Enumeration.A,
B = Enumeration.B,
}
及用途:
public void method(EnumSubset e)
{
}
您可能會感興趣的是這樣的:在C#中枚舉子集(HTTP:// trystans。 blogspot.com/2011/01/enum-subsets-in-c.html) – paulsm4