Anthony Pegramの回答を明確にします。
それは言っ型の値(例えば返すときに一般的なタイプは、いくつかの型引数に共変でFunc<out TResult>
の返品インスタンスTResult
、IEnumerable<out T>
の戻りインスタンスをT
)。つまり、何かがのインスタンスを返す場合、そのインスタンスをのようTDerived
に操作することもできますTBase
。
ジェネリック型は、その型の値をAction<in TArgument>
受け入れる(たとえば、のインスタンスを受け入れるTArgument
)ときに、いくつかの型引数に対して反変です。つまり、何かがのインスタンスを必要とする場合TBase
、のインスタンスを渡すこともできますTDerived
。
あるタイプのインスタンスを受け入れて返す両方のジェネリック型(ジェネリック型シグネチャで2回定義されていない場合など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
(ベースタイプ)に移動します。