2011-07-06 32 views
3

可能重複:
C# generic constraint for only integers
Generics - where T is a number?通用類型約束只接受數字?

在C#:

假設我們有過一個通用的類型,其中概念上我們的通用類型是有限的一個功能的情況下,只有數字。

所說的「數量」我們的目標是能夠乘用,加,減等對T類型的變量運營商

遺憾的是這樣的事情是不是在C#中接受:

public class Image<T> where T : number 

請注意,性能也很重要,所以我們不想去重新定義數字類型的結構並使用它們。

您認爲最好的方法是做什麼?或者是否有任何設計模式允許我們在泛型類型的變量上具有「高性能」算術函數?

+2

它不存在。 .net IMO最大的缺陷之一。你可以使用'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> 
{ 
} 

與任意數量的類型實現重寫所有的方法從

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

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)))); 
} 

+2

這不僅僅是你使用的可讀性,它也是你失去的性能。 – CodesInChaos

0

不幸的是沒有這樣的限制。最接近的東西存在是struct約束

此外,你可以谷歌數學庫.net暴露自己的類型有一個基類,使得它可以使用它作爲你想要的約束。