>백엔드 개발 >C++ >C#의 기본 클래스 목록에 파생 클래스 객체 목록을 할당 할 수 있습니까?

C#의 기본 클래스 목록에 파생 클래스 객체 목록을 할당 할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-02-02 05:31:08675검색

C# C# 프로그래밍 언어에서, 기본 클래스 참조 목록에 파생 된 클래스 객체의 목록은 협업 문제를 유발합니다. 이 문제는 파생 범주가 기본 클래스에 존재하지 않을 때 발생합니다. Can I Assign a List of Derived Class Objects to a Base Class List in C#?
예를 들어 다음 코드를 고려하십시오

이 코드에서 기린 물체의 목록은 동물이 참조한 목록에 할당됩니다. 그러나이 과제는 조정 문제로 인해 편집 중에 실패했습니다.

협력 및 비 변성 c #의 일반 유형은 조정되거나 변하지 않을 수 있습니다. 조정은 기본 클래스 참조가 파생 클래스 객체를 참조 할 수있게하는 반면, 비 데모는 그러한 할당을 방지합니다. 목록의 경우 기본 동작은 비 변동성이므로 목록에 목록을 할당 할 수 없음을 의미합니다.

솔루션

이 문제를 해결하기 위해 몇 가지 해결책이 있습니다.

명시 적 변환 :

> 다음 코드를 사용하여
<code class="language-csharp">class Animal { }
class Giraffe : Animal { }

static void Main(string[] args)
{
    List<Giraffe> giraffes = new List<Giraffe>();
    List<Animal> animals = giraffes; // 编译时错误
}</code>
를 목록에 표시하는 데

: 를 표시 할 수 있습니다.

그러나 변환이 유효하지 않으면 런타임 오류가 발생할 수 있으므로이 명시적인 변환을 사용하는 것이 좋습니다. convertAll 메소드 : 각 요소를 변환하는 람다 표현식을 제공하여 목록 를 변환하기 위해 목록을 사용할 수 있습니다. 예를 들면 :

icovariant 인터페이스를 구현하십시오

사용자 정의 인터페이스를 통해 일반 유형의 협업 변경을 지정하도록 명시 적으로 지정할 수 있습니다. icovariant 인터페이스를 구현함으로써 클래스는 객체가 일반 유형의 유전자 클래스를 사용하여 과제를 참조 할 수 있습니다. (참고 : 는 C#에 존재하지 않으며, 실제 솔루션은

자체가 조정을 지원하지 않기 때문에

를 사용하는 것입니다.) 변경.

    선택해야 할 방법은 특정 상황과 코드의 견고성에 대한 요구 사항에 따라 다릅니다. 방법은 일반적으로 더 안전하고 변환 의도를 표현하기 때문에 일반적으로 첫 번째 선택입니다. 의 ​​사용은 명백한 전환의 위험을 피하며 일반 프로그래밍의 원칙과 더 일치합니다.

위 내용은 C#의 기본 클래스 목록에 파생 클래스 객체 목록을 할당 할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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