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