Anthony Pegram'ın cevabını açıklığa kavuşturmaya çalışacağım.
Söz konusu türdeki değerleri (örn döndürdüğünde genel tip bir tür bağımsız değişkeni bildirdiğinden olan Func<out TResult>
geri dönüşü örneklerini TResult
, IEnumerable<out T>
bir döner örneklerini T
). Yani, bir şey örneklerini döndürürse TDerived
, olduğu gibi örneklerle de çalışabilirsiniz TBase
.
Genel tür, söz konusu türün değerlerini kabul ettiğinde (örneğin Action<in TArgument>
örneklerini kabul ettiğinde) bazı tür bağımsız değişkenlerinde çelişkilidir TArgument
. Yani, bir şeyin örneklere ihtiyacı varsa, örneklerden TBase
de geçebilirsiniz TDerived
.
Bazı türlerin örneklerini hem kabul eden hem de veren genel türlerin (örneğin genel tür imzasında iki kez tanımlanmadığı sürece CoolList<TIn, TOut>
) karşılık gelen tür argümanında kovaryant veya kontravaryant olmadığı oldukça mantıklı görünmektedir . Örneğin, List
.NET 4 tanımlanır List<T>
değildir, List<in T>
ya da List<out T>
.
Bazı uyumluluk nedenleri Microsoft'un bu bağımsız değişkeni görmezden gelmesine ve dizileri değer türü bağımsız değişkenleri üzerinde kovaryant haline getirmesine neden olmuş olabilir. Belki bir analiz yaptılar ve çoğu insanın dizileri sadece salt okunurmuş gibi kullandıklarını (yani, bir diziye bazı verileri yazmak için sadece dizi başlatıcıları kullandıklarını) ve bu nedenle avantajların olası çalışma süresinin neden olduğu dezavantajları aştığını tespit ettiler. diziye yazarken bir kovaryans kullanmaya çalıştığında hatalar. Bu nedenle izin verilir, ancak teşvik edilmez.
Orijinal soruya gelince, list.ToArray()
yeni oluşturur LinkLabel[]
(makul) uyarı kurtulmak için, orijinal listeden kopyalanan değerlerle ve, içeri geçmesi gerekir Control[]
için AddRange
. list.ToArray<Control>()
işi yapacak: argümanı olarak ToArray<TSource>
kabul eder IEnumerable<TSource>
ve geri döner TSource[]
; kovaryans sayesinde argüman olarak kabul edilen yönteme aktarılabilen List<LinkLabel>
salt okunur uygulamaları gerçekleştirir .IEnumerable<out LinkLabel>
IEnumerable
IEnumerable<Control>
LinkLabel
(uzman türü)Control
(baz türü) gidiyorum .