ウィキペディアで共分散と反分散に関する記事のセクションを読んでいるときに、次の太字の文に出くわしました。
最初に、配列型コンストラクターを考えてみましょう。型から
Animal
型Animal[]
(「動物の配列」) を作成できます。これを
- 共変: a
Cat[]
は aAnimal[]
- 反変: a
Animal[]
は aCat[]
- またはどちらでもない(不変)?
型エラーを回避したい場合、および配列が要素の読み取りと書き込みの両方をサポートしている場合、3 番目の選択肢のみが安全です。明らかに、配列から読み取るクライアントは Cat を期待するため、
Animal[]
すべてを a のように処理できるわけではありませんが、 には a などを含めることができます。したがって、反変規則は安全ではありません。Cat[]
Animal[]
Dog
逆に、 a
Cat[]
は として扱うことはできませんAnimal[]
。Dog
aを aに入れることは常に可能であるべきAnimal[]
です。共変配列では、バッキング ストアが実際には猫の配列である可能性があるため、これが安全であるとは限りません。したがって、共変規則も安全ではありません。配列コンストラクターは不変でなければなりません。これは可変配列のみの問題であることに注意してください。共変規則は、不変 (読み取り専用) 配列に対して安全です。
概念は理解しています。これがC#で「安全であるとは保証できない」方法の例が欲しいだけです。