2010年09月20日

これは反変性の例なのかな?

   このエントリーをはてなブックマークに追加 Clip to Evernote
Microsoftのサイトにある、『連載! とことん C#』の 第 11 回 共変性 (covariance) と反変性 (contravariance) ですが、

ここの「2.共変性と反変性」で説明している反変性の例は適切なのでしょうか?
そのコードを抜粋させていただきます。
なんか、ここで説明しているコードは、反変性の例になっていないような気がするのですが...
どなたかわかれば教えてください。

僕の理解では、C#で、こんな単純なコードで反変性を説明するのは 無理なんじゃないかと...
それとも、僕が知らないだけですか?


この記事へのコメント
反変性って言うなら、A→Bになってなきゃいけないように思うけど、
例は、B→Aみたいだから違いますよね。
Posted by BLUEPIXY at 2010年09月21日 20:52
ですよね。
反変性では「型を引数にしか使わない」といった説明がなされるので
完全に勘違いしたようですね。

Posted by Gushwell at 2010年09月21日 22:52
おそらく、
「派生クラスを引数に持つデリゲートに対して、
基礎クラスを引数に持つデリゲートをセットできる」
という話が抜けているんだと思います。

ということは、反対に、
「デリゲートの返り値の基礎/派生の話」についても
コードが不足しているように思います。
Posted by あおおにくん at 2010年09月22日 03:33
訂正です。

記事の下の方にデリゲートの話ありましたね、失礼しました^ ^;

で、Wikiによると
http://ja.wikipedia.org/wiki/%E5%85%B1%E5%A4%89%E6%80%A7%E3%81%A8%E5%8F%8D%E5%A4%89%E6%80%A7

基礎の型が引数のところに派生の型がセット可能ということで、
これであっていると思われます。

ただ、訳された言葉がいまいちイメージしにくいような・・・。
Posted by あおおにくん at 2010年09月22日 03:39
共変性や反変性という言葉は、「string が object のサブタイプなら string[] は object[] のサブタイプである」みたいに四つの型の関係を表す言葉なので、単に A と B の二つの型の関係にしか言及していない上の例で共変性とか反変性の話を持ち出すのはかなり違和感があります。

A、B、A を受け取るデリゲート、B を受け取るデリゲート、の四つの型の関係の話なら分かるんですが、上の例はデリゲートではなくただの関数しか出てきてないので……。
Posted by まじかんと at 2010年09月22日 09:58
4つの型があるから、
共変性の「共」、反変性の「反」の意味があるわけですね。

例のコードは、単なるアップキャストのコードであって、
単なるアップキャストに「共変性」「反変性」というのは
やはり、違和感がありますね。




Posted by Gushwell at 2010年09月22日 20:03
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52066887