ジェネリックメソッドで値型を返す時にボックス化させない方法
戻り値の型がTのジェネリックメソッドを実装した時、return (T)(object)value
のようなキャストを書いてしまうと、値型ではボックス化⇒ボックス化解除が行われてしまう。そもそもこういうコードを書くならジェネリクスじゃないだろという話は置いといて、ボックス化させない面白い方法を知った。
c# - How to avoid boxing of value types - Stack Overflow
c# - Primitive type conversion in generic method without boxing - Stack Overflow
ポイントは、値そのものではなくFunc
でキャストすること。Func<int>
⇒ object
⇒ Func<T>
とキャストすればコンパイルは通るし、実行時にT
がint
なら動作する。なお、Func<int>
⇒ object
⇒ Func<object>
やFunc<int>
⇒ object
⇒ Func<double>
などは実行時に例外となる。