C#에서 범위 외지 번호를 열거로 캐스트하는 것은 예외가되지 않습니다.

StackOverflow https://stackoverflow.com/questions/618305

  •  03-07-2019
  •  | 
  •  

문제

다음 코드는 예외를 생성하지 않고 대신 값 4를 TST로 전달합니다. 누구 든지이 이유를 설명 할 수 있습니까?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
도움이 되었습니까?

해결책

C#에서 Java와 달리 열거는 확인되지 않습니다. 기본 유형의 값을 가질 수 있습니다. 이것이 입력을 확인하는 것이 매우 중요합니다.

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

다른 팁

열거는 int를 기반으로하므로 int가 할 수있는 모든 값을 받아 들일 수 있습니다. 그리고 컴파일러를 명시 적으로 (캐스팅하여) 열거에 4를 캐스팅해도 괜찮다고 말하고 있기 때문에 그렇게합니다.

각 열거는 표현에 사용되는 기본 숫자 유형 (예 : int)을 가지고 있습니다. 값의 이름이 없더라도 열거가 가질 수있는 값입니다.

다른 사람들은 말하지 않은 것 : 캐스팅을 통해 컴파일러에게 자신이하고있는 일을 알고 있다고 말합니다. 따라서 당신이 그것을 말하면, 이것을 열거적인 값으로 취급하십시오. 다른 포스터는 C# 컴파일러가 많은 나쁜 일을 허용하지 않기 때문에 이것이 여전히 허용되는 이유를 지적했습니다.

값이 허용되지 않으면 실제로 나쁘다. 왜냐하면 플래그 값을 int로 저장할 수 없기 때문이다. 또는 누군가가 int가 허용 조합 중 하나인지 확인해야했는데, 플래그 열거 (함께 또는 함께 할 수있는 값)를 사용하면 많은 일이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top