> 백엔드 개발 > C++ > .NET 3.5 SP1에서 `Enumerable.Cast`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?

.NET 3.5 SP1에서 `Enumerable.Cast`가 `InvalidCastException`을 발생시키는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-10 09:35:41
원래의
901명이 탐색했습니다.

Why Does `Enumerable.Cast` Throw an `InvalidCastException` in .NET 3.5 SP1?

.NET 3.5 SP1 Enumerable.Cast에서 InvalidCastException

이 발생합니다.

.NET 3.5 SP1에서는 Enumerable.Cast 메서드를 사용하여 한 유형의 컬렉션을 다른 유형으로 변환할 때 특별한 동작이 관찰되었습니다. 다음 코드:

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

InvalidCastException 예기치 않게 던졌습니다. 이 수수께끼 같은 오류는 다음 코드와 같이 LINQ 구문을 사용할 때도 발생합니다.

<code class="language-csharp">var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());</code>
로그인 후 복사

숨겨진 행동 공개

처음에는 이 변환이 실패하는 이유가 혼란스러워 보입니다. 그러나 블로그 게시물은 잠재적인 문제를 조명합니다. .NET 3.5 SP1에서는 Cast<T>() 메서드가 IEnumerable 대신 IEnumerable<T>에 대해 작동하도록 수정되었습니다. 따라서 컬렉션의 각 요소는 변환 단계에 도달하기 전에 System.Object 안에 포함됩니다.

노출된 근본 원인

이러한 근본적인 변화는 미묘한 문제로 이어집니다. InvalidCastException은 기본적으로 다음 변환을 시도하여 발생합니다.

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>
로그인 후 복사

이 코드에서 볼 수 있듯이 intlong으로 직접 변환하면 예상한 결과가 생성되지만 박스형 intlong으로 변환하면 실패합니다. 이는 초기 코드 조각과 해당 LINQ 코드가 예상대로 작동하지 않는 이유를 설명합니다.

해결책 찾기

이 예외를 방지하려면 변환을 명시적으로 수행해야 합니다.

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
로그인 후 복사

이 대체 방법은 잘못된 변환 예외가 발생하지 않고 각 요소를 성공적으로 변환합니다.

이러한 비정상적인 동작은 일부 미묘한 배후 메커니즘이 코드 실행에 영향을 미칠 수 있음을 상기시켜 줍니다. 나중에 유사한 함정을 피하려면 대안을 모색하거나 변환을 명시적으로 처리하는 것이 좋습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿