分散は、安全な方法でのみサポートされます -実際には、CLRが既に持っている機能を使用します。したがって、List<Banana>
としてList<Fruit>
(またはそれが何であれ)を使おうとする本で私が挙げた例はまだ機能しませんが、他のいくつかのシナリオでは機能します。
まず、インターフェースとデリゲートでのみサポートされます。
次に、インターフェイス/デリゲートの作成者が型パラメーターをin
(反out
分散の場合)または(共分散の場合)に装飾する必要があります。最も明白な例はIEnumerable<T>
、値を「外に」取り出すことだけを許可するものです。新しい値を追加することはできません。それはなるでしょうIEnumerable<out T>
。これは型の安全性を損なうことはありませんが、たとえばIEnumerable<string>
、返すようIEnumerable<object>
に宣言されたメソッドからを返すことができます。
反変は、インターフェイスを使用するための具体的な例を示すのが困難ですが、デリゲートを使用すると簡単です。考えてみてくださいAction<T>
-それはT
パラメータを取るメソッドを表すだけです。Action<object>
asをシームレスに使用して変換できると便利です。代わりにパラメータが表示される場合はAction<string>
、object
パラメータを取るメソッドであれば問題ありませんstring
。もちろん、C#2にはすでにある程度のデリゲートの共分散と反分散がありますが、実際のデリゲート型から別の型への変換(新しいインスタンスの作成)によって-例についてはP141-144を参照してください。C#4はこれをより一般的なものにし、変換のために新しいインスタンスを作成することを(おそらくは)回避します。(代わりに参照変換になります。)
これで多少問題が解消されることを願っています。意味がわからない場合はお知らせください。