通用类型约束只接受数字?

时间:2011-07-06 13:17:51

标签: c# generics constraints

  

可能重复:
  C# generic constraint for only integers
  Generics - where T is a number?

在c#中:

想象一下我们在泛型类型上有一个功能,在概念上我们的泛型类型仅限于数字。

通过说“数字”,我们的目标是能够在T类变量上使用乘法,加号,减号等运算符。

不幸的是,c#中不接受这样的事情:

public class Image<T> where T : number

请注意,性能也很重要,因此我们不希望重新定义数值类型的结构并使用它们。

您认为最好的方法是什么?或者是否有任何设计模式允许我们对泛型类型的变量具有“高性能”算术函数?

2 个答案:

答案 0 :(得分:1)

以失去可读性为代价,您可以从

重写所有方法
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))));
}
使用

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>
{
}

实现任何数字类型。

答案 1 :(得分:0)

不幸的是没有这样的限制。最接近的是struct约束

此外,你可以使用.net的谷歌数学库,它们公开了自己的类型,这些类型有一个基类,可以将它用作你想要的约束。