2011-08-25 5 views
18

매개 변수로 int 배열을받는 웹 서비스 메서드에서 작업하고 메서드 내에서 열의 값을 열거 형 값으로 변환하여 저장했습니다. enum 목록. 그러나 열거 형에없는 값이 전달되면 문제없이 열거 형 목록에 추가됩니다. 아니 InvalidCastException, 아무것도. 내가 그것을 실행하면C# 열거 형 배열에서 잘못된 값을 받음

static class Program 
{ 
    static void Main(string[] args) 
    { 
     List<TestValues> values = new List<TestValues>() { 
      TestValues.Value1, 
      TestValues.Value2, 
      (TestValues)15 
     }; 

     foreach (var val in values) 
      Console.WriteLine(val); 

     Console.Read(); 
    } 

    enum TestValues 
    { 
     Value1 = 2, 
     Value2 = 4, 
     Value3 = 8 
    } 
} 

, 출력은 다음과 같습니다 : I는 다음과 같습니다 테스트 프로젝트 만든

내 웹 서비스에 대한
Value1 
Value2 
15 

, 내가 유효성 검사를 구현하는 것을, 그래서 이것은 hapen 않습니다 조금도. 하지만 ... 이상 하네! 런타임에서 InvalidCastException 또는 ArgumentOutOfRangeException 또는 유사한 것을 던져서는 안됩니까? 열거 형 목록 (int 값이 아님)을 얻었으므로 값을 열거 형 값으로 제한해야합니다 (열거 형).

내가 누락 된 항목이 있습니까? 이것은 .NET 버그, C# 버그인가요? 아니면 열거 형을 모르는 뭔가입니까?

+0

+1 – Tigran

+1

읽기이 하나 [왜 잘못된 열거 값으로하는 int 캐스팅하는 예외를 throw하지 않습니다?] [1] [1] : http://stackoverflow.com/ 질문/6413804/왜 캐스팅 int - 투 - 잘못된 - 열거 - 값 - 예외를 throw하지 않습니다 – vinayvasyani

답변

19

기본 유형에서 허용하는 enum에 값을 할당 할 수 있습니다. 기본적으로 기본 유형은 int이므로 어느 int 값을 enum에 할당 할 수 있습니다.

당신이 [Flags] 열거이있는 경우, 당신은 복합 값을 할당 할 수 있도록하려면 때문에 이에 대한 주된 이유는 다음과 같습니다

[Flags] 
public enum MyFlags 
{ 
    A = 1, 
    B = 2 
} 

MyFlags flags = (MyFlags)3; // Equivalent to setting A and B 

가 바람직 그냥 그렇게 열거 값을 사용하는 것을, 하지만 :

MyFlags flags = MyFlags.A | MyFlags.B; // Sets flags to 3 

그것은 [Flags] 속성이 할당을 사용하는 데 필요한되지 않는다는 것을 물론,주의하는 것이 중요합니다. 이 아파트는 enum입니다.

많은 사람들이 지적했듯이 Enum.IsDefined()을 사용하면 특정 값이 주어진 enum에 유효한지 확인할 수 있습니다. 귀하의 유효성 확인에 도움이됩니다.

+0

나는 거의 그것을 사용하지 않기 때문에'[플래그]'에 대해 completi 잊어 버렸습니다. 나에게 그것은 사용에 대한 분명한 이점 인 것처럼 보이지만 열거 형의보다 일반적인 사용에는 약간 이상합니다. 그건 그렇고, 댓글과 다른 답변은 주제에 대한 좋은 보완 링크를 제공합니다. – Raphael

1

int를 기반으로 모든 int 값을 항상 enum으로 캐스팅 할 수 있습니다. 이것은 모든 법적 가치를 확인해야한다면 캐스트가 훨씬 느려지므로 의도적으로 설계된 것입니다.

+1

나는 속도가 결정적인 요소라고 생각하지 않는다. –

+0

@Henk - 정교하게하십시오, 깃발 외에 다른 어떤 요인 있는가? –

1

intenum 내에 정의되어 있는지 확인하려면 Enum.IsDefined을 사용할 수 있습니다.

Enum.IsDefined(typeof(TestValues), 15); 
5

예, 열거 형 값으로 변환 할 때 정의 된 값을 확인하지 않습니다.

당신은 특정 값이 정의되어 있는지 확인하기 위해 IsDefined 방법을 사용할 수 있습니다 :

if (Enum.IsDefined(typeof(TestValues), value)) ...