>백엔드 개발 >C++ >C#에서 `List`를 `List`로 안전하게 캐스팅하려면 어떻게 해야 합니까?

C#에서 `List`를 `List`로 안전하게 캐스팅하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-09 22:51:46733검색

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

C#에서 List를 List로 안전하게 변환하세요. C#에서 상속 및 제네릭 유형을 처리할 때 파생 클래스 개체 목록을 기본 클래스 개체 목록으로 변환해야 하는 상황이 발생할 수 있습니다. 기본 클래스에 파생 클래스에서 재정의되는 가상 메서드가 포함되어 있으면 문제가 발생할 수 있습니다.

다음 예를 고려해 보세요.

이 코드를 컴파일할 때 "매개변수 1: 'System.Collections.Generic.List
<code class="language-csharp">class Animal
{
    public virtual void Play(List<Animal> animals) { }
}

class Cat : Animal
{
    public override void Play(List<Animal> animals)
    {
        // Cat 特定的实现
    }
}

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>”
    }
}</code>
'에서 'System.Collections.Generic.List

'로 변환할 수 없습니다"라는 오류 메시지가 표시됩니다. 이는 Cat 클래스가 Play 메서드를 재정의하더라도 메서드 매개 변수 유형(List)이 동일하게 유지되기 때문입니다. 이 문제를 해결하려면 일반 공분산의 개념을 이해해야 합니다. 일반 공분산을 사용하면 파생 클래스 재정의에서 매개 변수 유형을 안전하게 확장할 수 있습니다. 이 경우 매개변수 유형을 List

에서 List

로 확장하려고 합니다. C# 4에서는 IEnumerable

과 공분산에 안전한 인터페이스를 통해 일반 공분산을 지원합니다. Animal 클래스의 Play 메서드를 다음과 같이 선언합니다.

그런 다음 Cat 클래스에서 재정의하세요.
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>

Play 메소드를 공변적으로 안전하게 만들 수 있습니다. 이를 통해 List
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
를 메서드에 전달한 다음 공분산을 사용하여 IEnumerable

으로 안전하게 변환할 수 있습니다. 수정된 코드는 다음과 같습니다.

이 코드는 오류 없이 성공적으로 컴파일되고 실행되므로 IEnumerable를 사용하여 기본 클래스 메서드를 정의하고 파생 클래스가 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>

위 내용은 C#에서 `List`를 `List`로 안전하게 캐스팅하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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