파생 클래스 목록을 기본 클래스 목록으로 변환
공분산은 파생 유형이 기능 손실 없이 기본 유형을 대체할 수 있음을 의미합니다. 이 경우 기본 클래스(Animal)와 파생 클래스(Cat)가 있습니다. 여기서 기본 클래스에는 List를 입력 매개 변수로 받아들이는 가상 메서드 Play가 포함되어 있습니다.
다음 코드는 변환 문제를 보여줍니다.
<code class="language-csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication9 { class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } } }</code>
코드를 컴파일하면 다음 오류가 발생합니다. 인수 1: 'System.Collections.Generic.List
이 오류는 List가 쓰기 가능한 데이터 구조이기 때문에 발생합니다. List
이 문제를 해결하기 위해 C# 4에서는 알려진 안전 인터페이스에 대한 "일반 공분산"이라는 개념을 도입했습니다. IEnumerable
List
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { } } class Program { static void Main() { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
IEnumerable<T>
대신 List<T>
인터페이스를 사용하여 C#의 공분산 기능을 활용하고 유형 변환 오류를 방지하며 코드의 안전성을 보장합니다. IEnumerable<T>
은 데이터를 읽을 수만 있고 수정할 수는 없으므로 List<Cat>
를 IEnumerable<Animal>
로 변환하는 것이 안전합니다.
위 내용은 C#에서 `List`를 `List`로 캐스팅할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!