>백엔드 개발 >C++ >.NET에서 정수를 열거형으로 캐스팅해도 예외가 발생하지 않는 이유는 무엇입니까?

.NET에서 정수를 열거형으로 캐스팅해도 예외가 발생하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-03 17:46:40744검색

Why Does Casting an Integer to an Enum in .NET Not Throw an Exception?

Int를 잘못된 열거형 값으로 캐스팅: 예기치 않은 동작 이해

Java의 열거형 값 처리와 달리 .NET 열거형은 다음과 같은 경우 예기치 않은 동작을 나타냅니다. 유효하지 않은 정수 값을 해당 유형으로 캐스팅합니다. 이를 설명하기 위해 다음 코드를 고려하십시오.

enum Beer
{
    Bud = 10,
    Stella = 20,
    Unknown
}

var i = 50;
var b = (Beer) i;

Console.WriteLine(b.ToString());

예외를 발생시키는 대신 이 코드는 놀랍게도 i를 Beer로 캐스팅하고 "50"을 콘솔에 인쇄합니다. 왜 이런 일이 발생합니까?

열거형은 int 또는 short와 같은 기본 값 유형으로 뒷받침됩니다. 이를 통해 이러한 유형에 유효한 값을 저장할 수 있습니다. 따라서 Beer 열거형에 세 개의 정의된 값만 있어도 그 값 중 하나가 아닌 i를 수용할 수 있습니다.

이 특정 동작은 .NET 제작자가 내린 결정에서 비롯됩니다. 장점도 있지만 런타임 오류로 이어질 가능성이 있다는 비판도 받았습니다.

우려점 해결

이 문제를 해결하기 위해 일부 개발자는 다음을 만들었습니다. 열거형에 대해 빠른 실패 동작을 제공하는 EnumUtil 및 EnumExtensions와 같은 유틸리티 메서드입니다. 이러한 방법은 예상치 못한 예외를 방지하기 위해 enum 값을 캐스팅하기 전에 정의되도록 합니다.

다음은 EnumUtil을 사용하는 예입니다.

var definedValue = EnumUtil<Beer>.DefinedCast(i); // Throws exception if i is not defined in Beer
Console.WriteLine(definedValue.ToString());

설명 너머

.NET에서 열거형의 고유한 동작으로 인해 "비트 플래그" 열거형을 사용할 수도 있습니다. 이러한 열거형은 바이너리 패턴을 활용하여 단일 열거형 값 내에서 여러 활성 플래그를 나타냅니다. 이는 가능한 모든 플래그 조합을 정의하는 것이 번거로운 시나리오에서 특히 유용합니다.

결론

어떤 사람들은 .NET에서 열거형의 캐스팅 동작이 특이하다고 생각할 수도 있지만, 잘못된 열거형 값을 처리할 때 빠른 실패 동작을 보장하기 위한 기본 근거와 사용 가능한 옵션을 이해하는 것이 중요합니다. 유틸리티 방법을 활용하거나 비트 플래그 열거형의 가능성을 고려함으로써 개발자는 이 고유한 .NET 기능의 잠재적인 단점을 완화할 수 있습니다.

위 내용은 .NET에서 정수를 열거형으로 캐스팅해도 예외가 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.