Anthony Pegram의 답변을 명확히하려고 노력할 것입니다.
그것은 말했다 유형의 값 (예를 들어, 반환 할 때 일반 유형은 어떤 종류의 인수에 공변 인 Func<out TResult>
의 반환 경우 TResult
, IEnumerable<out T>
수익률 인스턴스 T
). 즉, 무언가가의 인스턴스를 반환하면 마치 인스턴스 인 TDerived
것처럼 작업 할 수 있습니다 TBase
.
제네릭 형식은 해당 형식의 값을 수락 할 때 (예 :의 Action<in TArgument>
인스턴스를 수락 할 때) 일부 형식 인수에 대해 반 변형 적입니다 TArgument
. 즉, 무언가의 인스턴스가 필요한 경우의 인스턴스를 TBase
전달할 수도 있습니다 TDerived
.
(예를 들어 일반 형식 서명에서 두 번 정의되지 않은 한) 일부 형식의 인스턴스를 허용하고 반환하는 일반 형식 CoolList<TIn, TOut>
은 해당 형식 인수에 대해 공변량 또는 반 변형이 아닙니다. 예를 들어, List
.NET 4 List<T>
에서는 List<in T>
또는 로 지정 되지 않습니다 List<out T>
.
호환성 문제로 인해 Microsoft는 해당 인수를 무시하고 값 유형 인수에 대해 배열을 공 변형으로 만들었습니다. 어쩌면 그들은 분석을 수행하여 대부분의 사람들이 읽기 전용 인 것처럼 배열을 사용한다는 것을 알았습니다 (즉, 배열 초기화 장치를 사용하여 배열에 일부 데이터를 쓰는 경우). 따라서 장점은 런타임으로 인한 단점을 능가합니다. 누군가 배열에 쓸 때 공분산을 사용하려고 할 때 오류가 발생합니다. 따라서 허용되지만 권장되지는 않습니다.
원래 질문에 대해서는 원래 목록에서 복사 된 값 list.ToArray()
으로 새로운 것을 만들고 LinkLabel[]
(합리적) 경고를 없애려면에 전달해야 Control[]
합니다 AddRange
. list.ToArray<Control>()
작업을 수행합니다 : 인수로 ToArray<TSource>
받아들이고 IEnumerable<TSource>
리턴 TSource[]
; 공분산 덕분에 인수로 받아들이는 메소드에 전달 될 수있는 List<LinkLabel>
읽기 전용을 구현 합니다.IEnumerable<out LinkLabel>
IEnumerable
IEnumerable<Control>
LinkLabel
(전문 유형)에서Control
(기본 유형)으로갑니다.