我有一个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