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

标签 c# generics constraints

<分区>

Possible Duplicates:
C# generic constraint for only integers
Generics - where T is a number?

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

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

关于c# - 通用类型约束只接受数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6597035/

相关文章:

c# - 在哪里可以获得 Microsoft.DirectX.dll?

c# - 如何构建与通用对象进行比较的 Linq 表达式树?

java - 如何向 GridBagLayout 添加空单元格?

java - java中泛型类的泛型容器

haskell - 跟踪约束的技术

module - 我可以用 1 个模块实现多种模块类型吗?

c# - 无法让自托管 Web api 通过 SSL 工作

c# - DateTime ConvertTimeBySystemTimeZoneId 不工作

c# - HttpWebRequest 问题 : System lacked sufficient buffer space or because a queue was full

java - 如何将泛型类型转换为String