結論
https://stackoverflow.com/a/29379250に載ってる方法で、1回分の仮想関数の呼び出しコストが増えるけどGenericsの特殊化みたいなことができる。
どういうことか
↓のようなコードを書くと、 Hogeの型引数 Tが intか doubleのときは Hoge<T>.P.Funcはなんらかの値を返してくれるけど、それ以外の場合は NotSupportedExceptionを投げるようになる。
Hoge.Pは IHoge<int>か IHoge<double>にしかキャストできないので、
Tがintかdoubleのとき、Hoge<T>.PはHoge.Pで初期化されるTがそれ以外の場合はHoge.P as IHoge<T>はnullになるので、Hoge<T>.Pはnew Hoge<T>()で初期化される
というように、Tが intか doubleのときだけ Hoge<T>.PがGenericじゃない方の Hogeで初期化されるのでこうなる。
publicinterfaceIHoge<T>{TFunc(Tvalue);}publicclassHoge<T>:IHoge<T>{publicstaticreadonlyIHoge<T>P=Hoge.PasIHoge<T>??newHoge<T>();publicTFunc(Tvalue){thrownewNotSupportedException();}}publicclassHoge:IHoge<int>,IHoge<double>{publicstaticreadonlyHogeP=newHoge();publicintFunc(intvalue){returnvalue;}publicdoubleFunc(doublevalue){returnvalue;}}