
파생 클래스 목록을 기본 클래스 목록으로 변환
공분산은 파생 유형이 기능 손실 없이 기본 유형을 대체할 수 있음을 의미합니다. 이 경우 기본 클래스(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!