> 백엔드 개발 > C++ > C#에서 `List`를 `List`로 직접 캐스팅할 수 없는 이유는 무엇입니까?

C#에서 `List`를 `List`로 직접 캐스팅할 수 없는 이유는 무엇입니까?

DDD
풀어 주다: 2025-01-17 01:01:12
원래의
324명이 탐색했습니다.

Why Can't I Directly Cast a `List` to a `List` in C#?

캐스트 목록<콘크리트형> to List

다음 코드를 고려하세요.

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

List<Client> clients = new List<Client>();
로그인 후 복사

많은 프로그래머는 이 List List:

List<IDic> dics = (List<IDic>)clients;
로그인 후 복사

그러나 이는 유효한 캐스트가 아닙니다. 이러한 유형의 캐스트는 유형 안전을 위반하므로 허용되지 않습니다. 이 캐스트를 시도하면 다음 오류가 발생합니다.

Cannot convert type 'System.Collections.Generic.List<Client>' to 'System.Collections.Generic.List<IDic>'
로그인 후 복사

왜 이 캐스트가 허용되지 않습니까?

이 캐스트가 허용되지 않는 이유는 안전하지 않은 행동의 가능성. 예를 들어 다음 시나리오를 생각해 보세요.

public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = (List<IFruit>)apples; // Assumed cast
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
로그인 후 복사

이 예에서 List List로 캐스팅됩니다. 이렇게 하면 바나나 개체를 과일 목록에 추가할 수 있습니다. 그러나 apples 목록의 첫 번째 요소에 액세스하면 여전히 Apple로 처리됩니다. 이로 인해 예상치 못한 동작과 잠재적인 버그가 발생할 수 있습니다.

안전한 변환 옵션

List List로 변환하는 경우 이러한 유형을 안전하게 변환하는 방법이 있습니다.

  • ToList(): .NET 4.0 이상에서는 다음을 사용할 수 있습니다. ToList() 메소드를 사용하여 List을 변환합니다. 새로운 List로 이동합니다. 이 메소드는 동일한 요소를 사용하지만 지정된 인터페이스 유형을 사용하여 새 목록을 생성합니다.
List<IFruit> fruit = apples.ToList<IFruit>();
로그인 후 복사
  • Cast().ToList(): In .NET 3.5에서는 Cast() 메서드를 사용하여 IEnumerable<인터페이스> List으로부터. 그런 다음 ToList()를 사용하여 새 List IEnumerable에서.
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
로그인 후 복사

이러한 변환으로 인해 새 목록이 생성된다는 점에 유의하는 것이 중요합니다. 한 목록에 대한 변경 사항은 다른 목록에 반영되지 않습니다. 그러나 목록의 개체에 대한 변경 사항은 두 목록 모두에 표시됩니다.

위 내용은 C#에서 `List`를 `List`로 직접 캐스팅할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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