C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 35 を表示中)
■17870 / )  Re[3]: C#のジェネリックの制約について
□投稿者/ 魔界の仮面弁士 (712回)-(2008/05/02(Fri) 18:04:52)
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"); }
}

解決済み
返信 編集キー/


管理者用

- Child Tree -