「共分散」と「反分散」という概念の意味は何ですか?
AnimalとElephant ( Animalから継承) の2 つのクラスが与えられた場合、 Elephant を Animals の配列に入れようとすると実行時エラーが発生するというのが私の理解です。特定の)アニマルよりも。しかし、Elephant が Animal プロパティを含むことが保証されていることを確認して、Animal を Elephant の配列に配置できますか?
「共分散」と「反分散」という概念の意味は何ですか?
AnimalとElephant ( Animalから継承) の2 つのクラスが与えられた場合、 Elephant を Animals の配列に入れようとすると実行時エラーが発生するというのが私の理解です。特定の)アニマルよりも。しかし、Elephant が Animal プロパティを含むことが保証されていることを確認して、Animal を Elephant の配列に配置できますか?
あなたはそれを逆に持っています。Elephant は Animal であるため、Animal 配列に追加できます。また、Animal に必要なすべてのメソッドが含まれていることが保証されています。Elephant 配列には、Elephant に必要なすべてのメソッドが含まれていないため、Animal を Elephant 配列に追加することはできません。
共分散と反分散に関するウィキペディアの記事には、これについての適切な説明があります。
プログラミング言語の型システム内では、型から型への演算子は、より具体的なものからより一般的なものへと型を順序付ける型の順序 ≤ を維持する場合、共変です。この順序を逆にすると反変です。これらのどちらにも当てはまらない場合、演算子は不変です。これらの用語は圏論から来ています。
また、タイプエレファントの方が「大きい」とおっしゃいましたが、そうではありません。タイプアニマルは、ゾウ、キリン、ライオンなど、より具体的なタイプを含むという意味で「より大きな」ものです。
この C# 4.0 の共分散と反分散の概要を見て、それが役立つかどうかを確認してください。
この正確な例を扱っているVisual Studio 2010 で .NET 4.0を導入する の 45 ~ 49 ページを読んでみてください。ゾウの素敵な写真もあります。
取り出す主なポイントは、これを行うことです
var things = new List<IThing<IContent>> { new ConcreteThing() }
と:
public class ConcreteThing : IThing<ConcreteContent>
{
}
インターフェイス定義に「out」が必要です。これにより、より具体的なフォームを設定できますが、IThing から読み取られるものはすべて、より一般的な型であることが保証されている必要があります。
public interface IThing<out T> where T : IContent
{
}