現在VBや#Cのような.NET言語は、属性の共変性と反変性をサポートしていない。これは、近い将来変わるとは考えにくいが、Microsoftでは、 それについて話している。共変性と反変性を完璧に紹介するには、余りにも長い時間がかかるであろう。そのため、Eric Lippert氏のシリーズであるCovariance and Contravariance in C#(リンク)を参考にすることを勧めている。
VBにおける共変性と反変性の属性タイプ(リンク)のサポートを追加するには、Lucian Wischik氏は以下の構文に従うことを提案している。
型パラメータは、キーワード「In」や「Out」で修飾することができる。「In」はメソッドパラメータとしてのみ、表示される型である。同様に、「Out」はメソッドの戻りの型としてのみ表示される型である。
Out型が便利な例は、IEnumerable(Of T)である。機能がIEnumerable(Of Animal)を要求している場合、IEnumerable(of Bird)はどんな状況下においても機能する。In型については、やや考案された例が望ましい。以下のインターフェイスを検討してみる。
Interface IWriter(Of T) Write(value As T)
IWriter(Of Animal)を要求している機能にIWriter(Of Bird)を渡す場合、明らかに機能しない。メソッドはAnimalのすべてのサブクラスをIWriter.Writeに渡すが、Birdsのみがサポートされる。
注釈付きでは、インターフェイスは以下のようになる。
Interface IEnumerable(Of Out T)
Interface IWriter(Of In T)
これはVB向けに提案されたが、C#でも使用可能である。
interface IEnumerable
interface IWriter
残念ながら、この構文は最も一般的なシナリオでは直接機能しない。IList(Of T)を検討するのがよい。コレクションに書き込むメソッドに渡す場合、TがIn型である。コレクションから書き込むメソッドに渡す場合、Out型である。 ここでのソリューションは、IList向けのベースクラスをレトロスペクティブに作成し、T値を受け入れるメソッドとT値を返すメソッドを区別する。
歴史的な注記としては、反変性(in/IWriterシナリオ)でランタイムエラーにつながる可能性があったとしても、C#およびVB は配列の共変性(out/IEnumerable scenario)をサポートする。C#をJavaと互換性をさらに持たせる目的であった。一般的に、これは哀れな決断だと見なされているが、今回は取り 消すことができない。