只接受数字的泛型类型约束

本文关键字:泛型类型 约束 数字 | 更新日期: 2023-09-27 18:01:25

可能的重复:
仅适用于整数的C#通用约束
泛型-其中T是一个数字?

在c#中:

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

通过说"数字",我们的目标是能够对T型变量使用乘法、加号、减号等运算符。

不幸的是,类似的东西在c#:中不被接受

public class Image<T> where T : number

请注意,性能也很重要,所以我们不想为数字类型重新定义结构并使用它们。

你认为最好的方法是什么?或者有没有任何设计模式可以让我们对泛型类型的变量拥有"高性能"算术函数?

只接受数字的泛型类型约束

以失去可读性为代价,您可以从重写所有方法

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

具有任何数字类型的实现。

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

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