チャンネル9でそれについてのビデオを見ましたが、あまり理解していませんでした。
誰かが私にこれらについて理解しやすい簡単な例を教えてもらえますか?その後、実際にどのように使用されるのでしょうか?
チャンネル9でそれについてのビデオを見ましたが、あまり理解していませんでした。
誰かが私にこれらについて理解しやすい簡単な例を教えてもらえますか?その後、実際にどのように使用されるのでしょうか?
あなたはこのブログを見たいと思うかもしれません.彼はそれを説明する素晴らしい仕事をしています.以下の記事はそれをうまくまとめています。
http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html
「共変性と反変性」とは、安全な場合に不正確な引数型を渡すことができるのと同じように、安全な場合に不正確なジェネリック型を渡すことができるようになったことを意味します。
ATiger
は IS であるAnimal
ため、できることは何でもAnimal
できます。を要求するメソッドがある場合は、Animal
を渡すこともできTiger
ます。
共分散- より具体的な型引数を渡す
これは、あなたが最もよく知っている方向です。IEnumerable<Tiger>
を期待する場所ならどこでも渡すことができIEnumerable<Animal>
ます。
static void ListAnimals(IEnumerable<Animal> animals)
{
}
List<Tiger> tigers = new List<Tiger>();
ListAnimals(tigers);
反変性- より一般的な型引数を渡す。
「反対」とは、これが通常のコンバージョン フローに「反する」ことを意味します。これは、実際に動かしてみるまで直感に反しているように見えるため、よりトリッキーです。
IComparer<Tiger>
1匹のトラと 2 匹のトラが比較されることを期待する関数があるとします。IComparer<Animal>
反変性は、2 頭のトラを比較することもできるため、より一般的なものも渡すことができると言います(トラは動物であるため)。より一般的な方法でそれらを比較しますが、これはまだタイプ セーフです。
static void CompareTigers(IComparer<Tiger> comparer, Tiger tiger1, Tiger tiger2)
{
comparer.Compare(tiger1, tiger2);
}
// normal - a tiger comparer can compare two tigers
IComparer<Tiger> tigerComparer = null;
CompareTigers(tigerComparer, new Tiger(), new Tiger());
// contravariance - an animal comparer can ALSO compare two tigers
IComparer<Animal> animalComparer = null;
CompareTigers(animalComparer, new Tiger(), new Tiger());
これはデリゲートでも機能することに注意してください。オブジェクトもデリゲートに安全に渡すことができるためAction<Animal>
、 を期待する関数に を渡すことができます。Action<Tiger>
Tiger
Action<Animal>
Eric Lippertは、最近のブログ投稿で非常に良い説明を思いついた
C# 4.0 (および VB) の MSDN ドキュメントはこちら: Covariance and Contravariance
具体的な例に興味がある場合は、ここにあります。
次の記事では、デリゲートの共変性と反変性について説明しています: http://msdn.microsoft.com/en-us/library/ms173174.aspx。
まだデリゲートに興味がなくても、役に立つかもしれません。とてもわかりやすいと思いました。