>백엔드 개발 >C++ >`IEnumerable.Cast`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?

`IEnumerable.Cast`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-10 07:37:43345검색

Why Does `IEnumerable.Cast` Throw an `InvalidCastException`?

InvalidCastExceptionIEnumerable.Cast

이해하기

IEnumerable<int>을 사용하여 IEnumerable<long>Cast<T>에 캐스트하려고 하면 종종 당황스러운 InvalidCastException이 발생합니다. 겉으로는 단순해 보이는 이 작업은 Cast<T> 메서드 내의 미묘한 메커니즘으로 인해 실패합니다. 다음 예를 고려해보세요:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>

근본 원인: 복싱 및 언박싱

이를 이해하는 열쇠는 Cast<T>의 작동 방식에 있습니다. IEnumerable이 아닌 IEnumerable<T>에 대한 확장 방법입니다. 이는 IEnumerable<int>에 대한 캐스트가 시도되기 전에 의 각 요소가 먼저 System.Object박스화long된다는 의미입니다. 이는 기능적으로 다음과 동일합니다.

<code class="language-csharp">int i = 1;
object o = i;  // Boxing
long l = (long)o; // Unboxing and Cast - This throws the exception!</code>

InvalidCastException언박싱 단계에서 발생합니다. int에서 long로 직접 캐스트하는 것은 유효하지만 박스형 intlong으로 언박싱하는 것은 유효하지 않습니다.

해상도

이를 방지하려면 InvalidCastException 강력한 형식의 IEnumerable<T> 컨텍스트 내에서 캐스트를 처리하는 메서드를 사용하세요(예: Select:

).
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Select(x => (long)x);
Console.WriteLine(castedList.First());</code>

이 접근 방식은 박싱이 발생하기 int전에 요소에 직접 캐스트를 수행하여 InvalidCastException을 방지합니다. Select을 사용하면 이러한 유형의 변환에 Cast<T>를 사용하는 것보다 더 명확하고 효율적인 솔루션을 제공합니다.

위 내용은 `IEnumerable.Cast`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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