2017-12-31 33 views
8

문자열에 Enum.IsDefined() 메서드를 사용했지만 True을 가져야하는 상황에서 False이 발생합니다. 아래의 코드를 확인하십시오 :Enum.IsDefined는 문자열에 대해 false를 반환합니다.

public enum YourEnum : int 
{ 
    Zero = 0, 
    One = 1 
} 

public class Program 
{ 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString())); 
    } 
} 

C# Fiddle Demo
결과 : 내가 두 번째 경우에 False을 얻을해야하는 이유를 모르겠어요

True 
False 

합니다. 어떤 도움을 주셔서 감사합니다.

+1

'Enum.Parse()'는'string'을 허용합니다. 'Enum.IsDefined()'는 당신의'enum'에 정의 된 * 상수 *를 당신이 전달하는 것과 비교합니다. – haim770

+0

그 대답은 yes가 내 질문과 관련이 없으므로 실제로'Enum.IsDefined'는 받아들입니다. 'object'를 두 번째 매개 변수로 사용하고 DoDefined도 두 번째 매개 변수의 유형을 확인하도록 요청해야합니다. –

답변

19

IsDefined() 메서드에 문자열을 전달할 때이라는 이름을 갖는 열거 형 에 값이 있는지 묻는 것이 좋습니다. The documentation
형 enumType의 모든 회원 • :

값 매개 변수는 다음 중 하나가 될 수 있습니다.
• 값이 enumType 유형의 열거 형 멤버 인 변수입니다.
열거 형 멤버의 문자열 표현입니다. 문자열의 문자는 열거 형 멤버 이름과 대소 문자가 같아야합니다.
• enumType의 기본 형식 값입니다.

똑같은 모든 결과 상기 제 1, 제 2 및 제 4 옵션 그것 때문에, 읽기 비트 혼란

(강조 광산)

: 열거 타입의 값이 전달되는이 (들 박스형 코스).

그러나 세 번째 옵션은 시나리오에서 진행되는 것으로 문자열은 이름이 열거 형 구성원의과 일치해야합니다. 문자열 "1"을 전달하면 열거 형의 유효한 이름은 "Zero""One"입니다. 문자열 "1"이 그 중 하나와 일치하지 않으므로 IsDefined()false을 반환합니다.

5

문자열을 인수로 전달하면 열거 형 이름 중 하나가 지정된 문자열과 같은지 확인합니다. 다음은 모두 true를 돌려줍니다 :

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero")); 

더의 source code (line 1503)를 참조하십시오. 그렇게 말하면 @Peter Duniho의 답변은 구현이 바뀔 수 있기 때문에 표시된대로이 정보를 문서에서 추론하는 것이 낫습니다. 그러나 그럼에도 불구하고 궁금한 점이 있다면 소스 코드가 있습니다.