2011-07-06 16 views
3

重複の可能性:C#で
C# generic constraint for only integers
Generics - where T is a number?数値のみを受け入れる汎用型制約?

我々は概念的に私たちの一般的なタイプが制限されるジェネリック型以上の機能を持っている場合を想像してみて数字だけに型Tの変数の「数」私たちは、乗算を使用することができることを目指し、プラス、マイナス、などの演算子と言って

残念ながら、このようなものは、C#で受け入れられない:

public class Image<T> where T : number 

パフォーマンスも重要なので、数値型の構造体を再定義して使用する必要はありません。

これを行うにはどうすればよいと思いますか?あるいは、ジェネリック型の変数に対して「高性能」算術関数を持たせることができるデザインパターンがありますか?

+2

存在しません。 .net IMOの最大の欠陥の1つ。 'MiscUtil'の演算子クラスを使うことはできますが、それはやや遅いです。一部のC#数値プロジェクトでは、コードジェネレータを使用して、共通の数値型のコードのバージョンを作成します。 [[Jeff Avatar Image]] – CodesInChaos

答えて

1

、あなたは、任意の数の種類の実装と

interface IEq<T> 
{ 
    bool Equals(T a, T b); 
} 

interface IOrd<T> : IEq<T> 
{ 
    int Compare(T a, T b); 
} 

interface IShow<T> 
{ 
    string Show(T a); 
} 

interface INum<T> : IEq<T>, IShow<T> 
{ 
    T Add(T a, T b); 
    T Subtract(T a, T b); 
    T Multiply(T a, T b); 

    T Negate(T a); 

    T Abs(T a); 
    T Signum(T a); 

    T FromInteger(int x); 
} 

interface IReal<T> : INum<T>, IOrd<T> 
{ 
} 

を使用して

T Factorial<T>(IReal<T> t, T x) 
{ 
    if (t.Equals(x, t.FromInteger(0))) return t.FromInteger(1); 
    return t.Multiply(x, Factorial<T>(t, t.Subtract(x, t.FromInteger(1)))); 
} 

int Factorial(int x) 
{ 
    if (x == 0) return 1; 
    return x * Factorial(x - 1); 
} 

からのすべてのメソッドを書き換えることができます。

+2

あなたが使用する読みやすさだけでなく、あなたが失うパフォーマンスです。 – CodesInChaos

0

残念ながら、このような制約はありません。最も近いものはstructという制約です

また、あなたが望む制約として使うことができる1つのベースクラスを持つ独自のタイプを公開する.netの数学ライブラリもあります。読みやすさを失うことの偉大なコストで

関連する問題