2011-02-09 4 views
8

저는 현재 책이 C# 4.0 in a Nutshell인데, 이는 고급 프로그래머가 좋은 참고 자료로 사용하기에 훌륭한 책이라고 생각합니다.Enum.IsDefined 플래그가 지정된 열거 형

기본에 대한 장을 뒤돌아 보았습니다. 플래그가 지정된 enum을 사용할 때 특정 값이 Enum에 정의되어 있는지 알기 위해 트릭을 보았습니다.
이 책은 Enum.IsDefined을 사용하여 플래그가 지정된 열거 형에서 작동하지 않는 상태 및 해결 방법이 같은 제안 : 특정 값이 플래그가 열거에 정의되어있는 경우

static bool IsFlagDefined(Enum e) 
{ 
    decimal d; 
    return (!decimal.TryParse(e.ToString(), out d); 
} 

이 사실 반환해야합니다.

누군가가 왜이 기능을 설명해 주시겠습니까? 한편

SomeValue, SomeOtherValue 

: 정의 된 값이 같은 것을 반환합니다 [Flags] 속성으로 선언 된 유형의 enum 값에 ToString를 호출 사전 : 기본적으로

+0

은 Enum.IsDefined가 예상과 다른 동작을하는 경우 (또는 기본값 (T) 일 수도 있음)를 고려해야합니다. Enum.IsDefined (default (T))는 true 및 _false_를 모두 반환 할 수 있습니다. default (T) (여기서 T는 열거 형)는 항상 (T) 0을 반환하므로 T가 (T) 0에 대해 유효한 값을 가지지 않으면 결과는 false입니다. 최소한 한 번은 trhown을 꺼내십시오. –

답변

12

에서

감사합니다, 값이 이 아니고 enum 유형 내에 정의 된 인 경우 ToString은 해당 값의 문자열 표현을 생성합니다. 정수(210) 값, 예컨대 :

5 

그래서 당신이 (저자가 decimal을 선택한 이유를 확실하지) 숫자로 ToString의 출력을 구문 분석 할 수 있다면, 그것이 유형 내에서 정의되지 않는 것입니다 무엇을 의미하는지.

[Flags] 
enum SomeEnum 
{ 
    SomeValue = 1, 
    SomeOtherValue = 2, 
    SomeFinalValue = 4 
} 

public class Program 
{ 
    public static void Main() 
    { 
     // This is defined. 
     SomeEnum x = SomeEnum.SomeOtherValue | SomeEnum.SomeFinalValue; 

     Console.WriteLine(x); 

     // This is not (no bitwise combination of 1, 2, and 4 will produce 8). 
     x = (SomeEnum)8; 

     Console.WriteLine(x); 
    } 
} 

위 프로그램의 출력은 다음과 같습니다 :

 
SomeOtherValue, SomeFinalValue 
8 

그래서 당신은 제안 된 방법이 어떻게 작동하는지 볼 수 있습니다

여기 그림입니다.

+0

SomeEnum.SomeValue = 0일까요? – PaulB

+0

@PaulB : 가능할 수 있습니다. 일반적으로 0에 대해 '없음'값이 있기 때문에 묻는 중입니까? 그건 사실이고 아마도 덜 혼란 스럽습니다. 어쩌면 나는 누군가를 버리지 않기 위해 대답을 업데이트 할 것입니다. –

+0

예 - SomeValue를 다른 사람들과 함께 표현할 수 없었습니다 ... 변경해 주셔서 감사합니다 :) – PaulB

0

플래그 조합을 사용하여 e 값을 만들 수없는 경우 ToString()은 기본값으로 정수입니다. 그리고 정수는 물론 decimal으로 해석됩니다.

그러나 왜 코드가 10 진수로 해석되는지 완전히 명확하지 않습니다. 하지만 Int64UInt64을 기반으로하는 enum에 대해 필수 유형이 작동하지 않을 수 있습니다.