8

ウィキペディアで共分散と反分散に関する記事のセクションを読んでいるときに、次の太字の文に出くわしました。

最初に、配列型コンストラクターを考えてみましょう。型からAnimalAnimal[](「動物の配列」) を作成できます。これを

  • 共変: aCat[]は aAnimal[]
  • 反変: aAnimal[]は aCat[]
  • またはどちらでもない(不変)?

型エラーを回避したい場合、および配列が要素の読み取りと書き込みの両方をサポートしている場合、3 番目の選択肢のみが安全です。明らかに、配列から読み取るクライアントは Cat を期待するため、Animal[]すべてを a のように処理できるわけではありませんが、 には a などを含めることができます。したがって、反変規則は安全ではありません。Cat[]Animal[]Dog

逆に、 aCat[]は として扱うことはできませんAnimal[]Dogaを aに入れることは常に可能であるべきAnimal[]です。共変配列では、バッキング ストアが実際には猫の配列である可能性があるため、これが安全であるとは限りません。したがって、共変規則も安全ではありません。配列コンストラクターは不変でなければなりません。これは可変配列のみの問題であることに注意してください。共変規則は、不変 (読み取り専用) 配列に対して安全です。

概念は理解しています。これがC#で「安全であるとは保証できない」方法のが欲しいだけです。

4

2 に答える 2

0

彼らが言おうとしているのは、次のようなことだと思います。

Dog dog = new Dog();
Cat[] cats = new Cat[] { catOne, catTwo, catThree };
Animal[] animals = cats;
animals.Add(dog);

Dogこのコードの 3 行目は、常に 4 行目 (s の配列へのa の追加) を実行できる必要があるため、正当ではありませんAnimalDogしかし、3 行目が有効である場合、4 行目は有効ではありません (s の配列にa を追加できないためCat)。

于 2013-07-12T16:07:24.303 に答える