2012-06-23 34 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) 
{ 
}