C#에서 파생 클래스 목록을 기본 클래스 목록으로 변환
이 예는 파생 클래스 객체 목록(예: List<Cat>
)을 기본 클래스 객체 목록(List<Animal>
)을 기대하는 메서드에 전달하는 일반적인 문제를 보여줍니다. 기본 클래스 참조는 파생 클래스 객체를 직접 가리킬 수 없으므로 직접 할당은 허용되지 않습니다.
문제:
List<Cat>
매개변수가 있는 메소드에 List<Animal>
를 전달하려고 하면 컴파일러 오류가 발생합니다.
해결책: IEnumerable
및 공분산
이 솔루션은 C#의 일반 공분산을 활용합니다. List<Animal>
을 사용하는 대신 메소드 매개변수 유형을 IEnumerable<Animal>
으로 변경하세요. IEnumerable
은 읽기 전용 인터페이스입니다. 이렇게 하면 메소드가 원본 컬렉션을 수정하는 것을 방지하여 잠재적인 유형 안전 문제를 해결할 수 있습니다.
수정된 코드:
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { //Implementation } } class Program { static void Main() { Cat myCat = new Cat(); myCat.Play(new List<Cat>()); // This now compiles successfully } }</code>
이는 List<Cat>
이 암시적으로 IEnumerable<Cat>
로 변환되고 IEnumerable<Cat>
가 IEnumerable<Animal>
과 공변적이기 때문에 작동합니다. Play
메서드는 이제 컬렉션을 수정하지 않고도 컬렉션 전체를 안전하게 반복할 수 있습니다. 이 접근 방식은 유연한 메서드 매개변수화를 허용하면서 유형 안전성을 유지합니다.
위 내용은 C#에서 목록을 목록으로 어떻게 캐스팅할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!