2008/05/02(Fri) 22:13:02 編集(投稿者)
# 解決チェックを外してしまっていたので、つけなおし。
■No17865 (studyC# さん) に返信
VB だったら、Option Strict Off にしておいて、
Return CObj(a) + CObj(b)
とする手もあるのですけれどね。
> そうですね。このケースだとstaticですね^^
と思いましたが、型パラメータの指定を考えると、インスタンスメソッドの方が楽かも…。
同じ演算子を繰り返し使う場合、型引数を毎回指定して
a = MyMath<System.Int32>.Minus(30, 12);
b = MyMath<System.Int32>.Minus(30, 10);
と書かせるよりも、
a = foo.Minus(30, 12);
b = foo.Minus(30, 10);
のように書けた方が楽ですし。
もし、static にするのであれば、
static class MyMath<T>
{
public static T Minus(T x, T y) { … }
}
ではなく、
static class MyMath
{
public static T Minus<T>(T x, T y) { … }
}
とするのも手かも知れません。これなら利用時は、
int c = MyMath.Minus(30, 8);
のように、型推論が使えますので。
>>2.0 の時は、こんな方法で逃げていました。
> 制約では対処できないのですねぇ。
> なんかやり方がある筈と思ってましたが・・・orz
C# は専門外なので、単に私が知らないだけかも知れませんけれどね。
> Microsoft.VisualBasic.CompilerServices.Operators.AddObjectなんてものがあるのですね。
他に使えそうなのは、Microsoft.JScript.Plus.DoOp とか、IL の動的生成とか。
演算効率を落としても良ければ、こんな手も。
public class MyMath<T>
{
DataRow row;
public MyMath()
{
DataTable dt = new DataTable();
dt.Columns.Add("x", typeof(T));
dt.Columns.Add("y", typeof(T));
dt.Columns.Add("Plus", typeof(T)).Expression = "x+y";
dt.Columns.Add("Minus", typeof(T)).Expression = "x-y";
row = dt.Rows.Add();
}
private T DoOp(T x, T y, string method)
{
row["x"] = x;
row["y"] = y;
return (T)row[method];
}
public T Plus(T x, T y) { return DoOp(x, y, "Plus"); }
public T Minus(T x, T y) { return DoOp(x, y, "Minus"); }
}