さまざまな数値タイプを取り、それらを2番目のメソッドのために前処理するメソッドを構築しようとしています。単にオーバーロードするべきなのか、ジェネリックメソッドを使用するべきなのかわかりません。ジェネリックメソッドを使用しようとしましたが、メソッドがパラメータタイプを認識していないようです。コードは以下のとおりです。この場合、オーバーロードするのが良いのか、一般的なメソッドを使用するのが良いのか、誰かに説明してもらえますか?また、これを行うためにジェネリックメソッドを使用したい場合、どうすればそれを機能させることができますか?どうもありがとうございます。
public static class math
{
public static int nextpow2<T>(T a)
{
double w;
if ( a.GetType() is sbyte ||
a.GetType() is byte ||
a.GetType() is short ||
a.GetType() is ushort ||
a.GetType() is int ||
a.GetType() is uint ||
a.GetType() is long ||
a.GetType() is ulong ||
a.GetType() is float ||
a.GetType() is double ||
a.GetType() is decimal
) w = (double)Convert.ChangeType(a, typeof(double));
else
throw new System.ArgumentException("Internal error in nextpow2: argument a is not a number!");
return _nextpow2(w);
}
private static int _nextpow2(double a)
{
double index = Math.Abs(a);
int p = (index > 1) ? (int)Math.Ceiling( Math.Log( index, 2.0) ) : 0;
return p;
}
私は次のようにメソッドを呼び出しています:
int indx = 0;
int p = math.nextpow2(indx);
コードのコンパイルに失敗します。次のエラーが発生します。
nextpow2の内部エラー:引数aは数値ではありません!
誰かが私が間違っていることを説明できますか?ありがとうございました。