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」を読み返してみたら、ちゃんと書いてあった。共変型引数には +、反変型引数には - ってフラグが付くらしい。