BT

InfoQ ホームページ ニュース .NET汎用における共変性と反変性

.NET汎用における共変性と反変性

ブックマーク

現在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と互換性をさらに持たせる目的であった。一般的に、これは哀れな決断だと見なされているが、今回は取り 消すことができない。

原文はこちらです:http://www.infoq.com/news/2008/08/GenericVariance

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。