17

チャンネル9でそれについてのビデオを見ましたが、あまり理解していませんでした。

誰かが私にこれらについて理解しやすい簡単な例を教えてもらえますか?その後、実際にどのように使用されるのでしょうか?

4

5 に答える 5

9

あなたはこのブログを見たいと思うかもしれません.彼はそれを説明する素晴らしい仕事をしています.以下の記事はそれをうまくまとめています。

http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html

「共変性と反変性」とは、安全な場合に不正確な引数型を渡すことができるのと同じように、安全な場合に不正確なジェネリック型を渡すことができるようになったことを意味します。

于 2009-11-12T19:58:14.540 に答える
7

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>TigerAction<Animal>

于 2014-02-17T07:29:08.593 に答える
3

Eric Lippertは、最近のブログ投稿で非常に良い説明を思いついた

于 2009-12-11T01:13:41.817 に答える
1

C# 4.0 (および VB) の MSDN ドキュメントはこちら: Covariance and Contravariance

具体的な例に興味がある場合は、ここにあります。

于 2009-12-11T01:07:38.253 に答える
1

次の記事では、デリゲートの共変性と反変性について説明しています: http://msdn.microsoft.com/en-us/library/ms173174.aspx

まだデリゲートに興味がなくても、役に立つかもしれません。とてもわかりやすいと思いました。

于 2009-11-12T20:01:39.490 に答える