C#에서 목록를 목록
로 변환상속을 처리할 때 파생 클래스 개체 목록을 기본 클래스 개체 목록으로 변환해야 하는 경우가 있습니다. 그러나 이를 제대로 처리하지 않으면 오류가 발생할 수 있습니다.
쓰기 가능한 데이터를 사용한 목록 변환 오류
다음 코드를 고려하세요.
<code class="language-c#">using System; using System.Collections.Generic; class Animal { public virtual void Play(List<Animal> animal) { } } class Cat : Animal { public override void Play(List<Animal> animal) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
이 코드는 목록 개체 유형의 불일치로 인해 컴파일 오류를 생성합니다. Animal은 자체 유형(Animal)의 목록을 기대하지만 이 메서드는 Cat 개체 목록과 함께 호출됩니다.
오류 원인
이 오류는 목록에 쓰기가 가능하기 때문에 발생합니다. 변환이 허용되면 데이터 조작 문제가 발생할 수 있습니다. 예를 들어, 개 객체를 고양이 목록에 추가하면 유형 안전성을 위반할 수 있습니다.
일반 공분산
C# 4에서는 일반 공분산이라는 기능이 도입되었습니다. 이를 통해 이러한 유형이 유형 안전성을 보장하는 경우 파생 클래스 목록을 기본 클래스 목록으로 변환할 수 있습니다. 일반 공분산을 위한 안전한 유형의 예로는 IEnumerable<T>
이 있는데, 이는 객체의 시퀀스를 나타내지만 쓸 수는 없습니다.
일반 공분산 구현
일반 공분산을 구현하려면 다음과 같이 IEnumerable<T>
를 매개변수 유형으로 사용하도록 기본 클래스의 메서드 시그니처를 변경할 수 있습니다.
<code class="language-c#">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>
이 예에서 Animal의 Play 메서드는 IEnumerable<Animal>
을 매개 변수로 사용하여 일련의 Animal 및 Cat 개체를 허용합니다.
위 내용은 C#에서 목록을 목록으로 안전하게 캐스팅하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!