ジェネリクスの共変性・反変性

ジェネリクスの共変性・反変性 (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/sp4_variance.html
概要、ジェネリクスの共変性・反変性、in/out修飾子、in/outの内部実装、値型はinvariant


ジェネリクスコレクションに関して、

List<string> strings = {"aa", "bb", "cc"};
List<object> objs = strings;

のようなことをしたいけど、これだとobjs[0]=5のようにintにsetされてしまう。
そこで、Listがgetしかできない(戻り値しか使えない)ようにすればよいという発想になる。これが共変性。outを使う。
逆に、引数でしか使わない場合には、setしか出来ないようにすればいい。これが反変性。inを使う。

getしかしない 戻り値しか使わない 共変性(covariance) out
setしかしない 引数でしか使わない 反変性(contravariance) in
public interface IComparer<in T>
{
  int Compare(T a, T b); // T は引数としてしか使われない
}