ジェネリクスの共変性・反変性
ジェネリクスの共変性・反変性 (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 は引数としてしか使われない }