BT

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

| 作者: Jonathan Allen フォローする 554 人のフォロワー , 翻訳者 編集部 フォローする 0 人のフォロワー 投稿日 2008年8月21日. 推定読書時間: 2 分 |

現在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

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

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

このスレッドのメッセージについてEmailでリプライする

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

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

.NETの派生を理解する

Wayne Citrin 2018年7月18日 午前3時44分

ASP.NET Core - シンプルの力

Chris Klug 2018年6月4日 午前3時26分

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT