【问题标题】:Generic Type Constraint to accept only Numbers? [duplicate]通用类型约束只接受数字? [复制]
【发布时间】:2011-07-06 21:47:34
【问题描述】:

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

在 C# 中:

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

通过说“数字”,我们旨在能够对 T 类型的变量使用乘法、加法、减法等运算符。

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

public class Image<T> where T : number

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

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

【问题讨论】:

  • 它不存在。 .net IMO 的最大缺陷之一。可以使用MiscUtil 的操作符类,但是速度比较慢。一些 C# 数字项目使用代码生成器为常见数字类型创建代码版本。 [[杰夫头像]]

标签: c# generics constraints


【解决方案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>
{
}

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

【讨论】:

  • 这不仅是您使用的可读性,也是您失去的性能。
【解决方案2】:

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

您还可以搜索 .net 的 google 数学库,其中公开了自己的类型,这些类型具有一个基类,可以将其用作您想要的约束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多