それを継承したCircleクラスというのもあるとします。円ですね。
では、円のリストを作ってみましょう
var clist = new List<circle>();
List
さて、ここまでは良いのですが、この円のリストをシェイプのリストにキャストしようとすると失敗します。コンパイルエラーです。
var slist = clist as List<shape>;
仮にasではなくキャスト演算子を使ったとしても失敗です。
ジェネリッククラスで指定された型はアップキャストできないわけです。
おかしくない? ねえ、おかしくない?
円のリストというのは、当然形のリストでもあるわけですから型変換できてしかるべきですよね。
実は昔、似たような問題に出くわして設計できねー!ってなって1年近くプログラムから離れた時期がありました。
……今昔の再現をしてたら同じ問題でした。
<すぐさま追記>
List
ConvertAll
var slist = clist.ConvertAll<ishape>(c => c as IShape);
うーむ。なるべくシンプルにしたのですがややこしいですね。
しかもConvertAll
0 件のコメント:
コメントを投稿