InvalidCastException
IEnumerable.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
로 직접 캐스트하는 것은 유효하지만 박스형 int
을 long
으로 언박싱하는 것은 유효하지 않습니다.
해상도
이를 방지하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!