Enumerable.Cast()
던진InvalidCastException
.NET 3.5 SP1에서는 Cast<T>()
을 사용하여 IEnumerable
을 변환할 때 InvalidCastException
예외가 이상하게 발생했습니다. 다음 코드를 고려해보세요:
<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 }; IEnumerable<long> castedList = list.Cast<long>(); Console.WriteLine(castedList.First());</code>
이 코드에서 예외가 발생하는 이유는 무엇인가요?
이 비정상적인 동작은 .NET 3.5와 .NET 3.5 SP1 간의 Cast<T>()
메서드 동작 변경으로 인해 발생합니다. SP1 이전에는 Cast<T>()
이 IEnumerable<T>
에 대해 작업하여 직접 변환을 허용했습니다. 그러나 SP1에서는 IEnumerable
에서 작동하도록 수정되었습니다. 즉, 요소가 변환되기 전에 System.Object
로 unboxing됩니다.
InvalidCastException
을 int
로 직접 변환하는 것과 달리 박스형 long
을 int
으로 변환하는 것은 허용되지 않기 때문에 이 언박싱 작업으로 인해 long
이 발생합니다. 효과적으로 이 코드는 다음을 수행하려고 시도합니다.
<code class="language-csharp">int i = 1; object o = i; long l = (long)o;</code>
이 역시 마찬가지 InvalidCastException
가 됩니다.
해결책 및 설명
이 문제를 해결하려면 람다 식을 사용하여 요소를 명시적으로 변환할 수 있습니다.
<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
이렇게 하면 요소가 long
로 성공적으로 변환됩니다.
이 이렇게 동작하는 이유는 Cast<T>()
이 IEnumerable
이 아닌 IEnumerable<T>
의 확장 메서드이기 때문입니다. 요소가 변형 단계에 도달하면 이미 object
로 상자에 넣어져 있습니다. object
에서 특정 유형으로 변환하면 InvalidCastException
이 발생합니다.
위 내용은 .NET 3.5 SP1에서 `IEnumerable.Cast()`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!