2012-06-23 3 views
4

관리 enum :내가 가진 열거 필드

public enum Enumeration 
{ 
    A, 
    B, 
    C 
} 

그리고 유형 Enumeration의 하나 개의 인수를 취하는 방법 :

public void method(Enumeration e) 
{ 
} 

내가 methodAB (C 간주됩니다 받아 들일 수 있다고합니다 잘못된 값),하지만 내 Enumeration 다른 값을 올바른 값으로 받아 들일 수 있기 때문에 필요합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+2

당신은 이런 일에 관심이있을 수 있습니다. blogspot.com/2011/01/enum-subsets-in-c.html) – paulsm4

답변

6

그냥C을 거부하지 않겠습니다.

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

이 중요하다, 그렇지 않으면 사람들이 부를 수로 :

Method((Enumeration) -1); 

를하고 그것은 당신의 유효성 검사를 통과 것이다 나는 AB 이외의 값을 거부 할 것입니다. 열거 형은 실제로 명명 된 정수 집합이라는 것을 항상 알고 있어야합니다. 그러나 임의의 기본 형식의 정수를 열거 형으로 형변환 할 수 있습니다. paulsm4가 언급 한 바와 같이

+0

왜 'ArgumentException' 대신에'ArgumentOutOfRangeException'을 사용해야합니까? – 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

메모 : '계약'은 .NET Framework 4 이상에서만 유효합니다. – gliderkite

+0

다소 이상한 비교인데 왜 단순히'! ='를 사용하지 않는가? –

+0

@EdS : "not a and b"보다 "not (a 또는 b)"를 읽는 것이 더 쉽다고 생각하지만, 걱정한다면 그것을 변경할 수 있습니다. –

1

, 당신은 정의 할 수 있습니다 :

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

및 사용 : [C#에서 열거 집합 (HTTP : // trystans

public void method(EnumSubset e) 
{ 
}