generic引数のco/contra-variance

C# 4.0、generics の型引数に共変性・反変性を指定できるようになったわけですが。

IEnumerator<out T>
{
  T Current { get; }
  bool MoveNext();
}

IComparable<in T>
{
  bool CompareTo(T x);
}

のみたいなの。in/out を付けることで、型引数 T はそれぞれ入力/出力にしか使われませんよというのを保証する構文。

これの実装、どうなってるのかを調べてみた結果、初めて知ったんですが、IL の仕様的には 2.0 の時点ですでに共変性・反変性のフラグ持ってるんですね。

「Expert .NET 2.0 IL Assember」を読み返してみたら、ちゃんと書いてあった。共変型引数には +、反変型引数には - ってフラグが付くらしい。