平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

続・C#のジェネリクスで型クラスを真似る

前回のエントリ

前回のコード(GitHub Gist)は、値を入れるValue<TImpl, T>クラスが単なるDictionary<string, object>のラッパーでしかなく、汚れ仕事を押し付けた形となっていた。

そこを何とかしようと思うと、今回のコード(GitHub Gist)みたいになる。

とはいえ、型クラスもどきの方は型引数TImplに実装クラスMaybeを入れられるが、値クラスの方は型引数を使ったとしても実装クラスMaybe<T>ジェネリックのため指定できない。(型引数を取る型引数が不可能、というのにやられているわけだ。)

なのでMaybe<T>を引き回すことができない。型クラスもどきのメソッドを呼び出すたびにValue<Maybe, T>にアップキャストされてしまうのだ。そこで仕方なく、明示的なダウンキャストでMaybe<T>に戻さないといけなくなる。