>백엔드 개발 >C++ >C#에서 `List`를 `List`로 캐스팅할 수 있나요?

C#에서 `List`를 `List`로 캐스팅할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2025-01-09 22:32:47298검색

Can I Cast a `List` to a `List` in C#?

파생 클래스 목록을 기본 클래스 목록으로 변환

공분산은 파생 유형이 기능 손실 없이 기본 유형을 대체할 수 있음을 의미합니다. 이 경우 기본 클래스(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'에서 'System.Collections.Generic.List'로 변환할 수 없습니다.

이 오류는 List가 쓰기 가능한 데이터 구조이기 때문에 발생합니다. List에서 List로의 변환을 허용하면 고양이 목록에 개가 추가되어 예상치 못한 동작이 발생할 수 있습니다.

이 문제를 해결하기 위해 C# 4에서는 알려진 안전 인터페이스에 대한 "일반 공분산"이라는 개념을 도입했습니다. IEnumerable은 그러한 인터페이스입니다. IEnumerable은 변형을 허용하지 않으므로 공변적으로 안전한 것으로 간주됩니다.

List 대신 IEnumerable을 허용하도록 Play 메서드를 수정하여 변환 문제를 해결할 수 있습니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.