.NET에서 인덱스 액세스 지원으로 공분산을 활용하면
공분산을 통해 프로그래머는 명시적인 유형 캐스팅 없이 파생 클래스를 기본 클래스로 처리할 수 있습니다. 그러나 .NET에서는 인덱스 액세스 지원이 부족한 공변 컬렉션에 제한이 있습니다. 이 문제는 특정 유형의 컬렉션(예: Dog 개체를 포함하는 목록)을 기본 유형(예: Animal)의 컬렉션으로 변환하려고 할 때 발생합니다.
기본 문제 이해
문제는 List가 Add 메서드로 구성된 ICollection을 구현한다는 사실에서 발생합니다. 동물 기반 IList로 업캐스팅하면 모든 유형의 동물을 무분별하게 추가할 수 있으며 원래 컬렉션의 유형 제약 조건을 위반합니다.
색인 지원이 포함된 공변 컬렉션
.NET 4.5 및 나중에:
이전 .NET 버전의 경우:
구현:
다음 C# 코드는 공분산 확장 방법을 사용하는 사용자 지정 래퍼 접근 방식을 보여줍니다.
public static class Covariance { public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail) { return new CovariantList<T>(tail); } private class CovariantList<T> : IIndexedEnumerable<T> { private readonly IList<T> tail; public CovariantList(IList<T> tail) { this.tail = tail; } public T this[int index] { get { return tail[index]; } } public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();} IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); } public int Count { get { return tail.Count; } } } } public interface IIndexedEnumerable<out T> : IEnumerable<T> { T this[int index] { get; } int Count { get; } }
이 확장 방법을 사용하면 다음에서 볼 수 있듯이 인덱스 지원을 통해 공변 컬렉션을 생성할 수 있습니다. 다음 예:
List<Dog> dogs = new List<Dog>(); IIndexedEnumerable<Animal> animals = dogs.AsCovariant();
위 내용은 .NET 컬렉션에서 인덱스 액세스로 공분산을 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!