public No22_SupportCovarianceAndContravarianceInGenerics() { //目的: //①共変性の実装:アップキャストの実装 //②反変性の実装:親の実行でポリモーフィズムできるように実装 //概要: //-------------------------------------------------------------------------------------- IEnumerable <Asteroid> asteroids = new List <Asteroid>() { new Asteroid() { Name = "a", Mass = 3 } , new Asteroid() { Name = "b", Mass = 2 } , new Asteroid() { Name = "c", Mass = 1 } }; //共変性:IEnumerable<out T>が共変性をout修飾子によって実装しているおかげで、暗黙的にアップキャストできる // IEnumerable<out T>はoutによって、強い型を返却することを許している Variance.CovariantGeneric(asteroids); //反変性:Comparison<in T>が反変性をin修飾子によって実装しているおかげで、ポリモーフィズムを実行できる // Comparison<in T>はinによって、弱い型を受領することを許している Variance.ContravariantGeneric(); //不変性:IList<T>は修飾子がないため、厳密に同じ型のみ許す //Variance.InVariantGeneric(asteroids); //したがって、自身が定義したジェネリクスクラスに、IEnumerableのような自然なアップキャストを実装したければout修飾子を用いる //また、IComparer<T>とSortedSet<T>のような、自身が定義したジェネリクスクラスを引数にポリモーフィズムを実行するメソッドを実装したければin修飾子を用いる }