ジェネリックの共変性と反変性 http://msdn.microsoft.com/ja-jp/library/vstudio/dd799517.aspx 共変性 †Base という基本クラスと、Derived という派生クラスがあるとします。ポリモーフィズムによって、Derived のインスタンスを Base 型の変数に代入できます。 IEnumerable<Derived> d = new List<Derived>(); IEnumerable<Base> b = d; 反変性 †Action<Base> b = (target) => { Console.WriteLine(target.GetType().Name); }; Action<Derived> d = b; d(new Derived()); 共変性と反変性は、"分散" と総称されます。 共変または反変としてマークされていないジェネリック型パラメーターは、不変と呼ばれます。 共通言語ランタイムにおける分散について、簡潔な概要を示します。 1、.NET Framework 4 のバリアント(Variant)型パラメーターは、ジェネリック インターフェイス型と汎用デリゲート型に制限されています。 共変の型パラメーターを持つジェネリック インターフェイス
反変の型パラメーターを持つジェネリック インターフェイス
public class Base { } public class Derived : Base { } class Program { public static Derived MyMethod(Base b) { return b as Derived ?? new Derived(); } static void Main(string[] args) { Func<Base, Derived> f1 = MyMethod; // 共変リターンタイプ Func<Base, Base> f2 = f1; Base b2 = f2(new Base()); // 反変パラメータタイプ Func<Derived, Derived> f3 = f1; Derived d3 = f3(new Derived()); // 共変リターンタイプAND反変パラメータタイプ Func<Derived, Base> f4 = f1; Base b4 = f4(new Derived()); } } ★月額105円~/容量最大30GB/機能満載! ロリポップ!レンタルサーバー ★ コメント: |