一尘不染

通用C#代码和Plus运算符

c#

这个问题已经在这里有了答案

是否存在将我的通用方法限制为数字类型的约束? (21个回答)

6年前关闭。

我正在编写一个类,它对C#中的每个原始数字类型进行基本上相同的计算类型。尽管实际的计算更为复杂,但可以将其视为一种计算多个值的平均值的方法,例如

class Calc
{
    public int Count { get; private set; }
    public int Total { get; private set; }
    public int Average { get { return Count / Total; } }
    public int AddDataPoint(int data)
    {
        Total += data;
        Count++;
    }
}

现在,为了支持double,float以及可能定义了operator +和operator /的其他类的相同操作,我的第一个想法就是简单地使用泛型:

class Calc<T>
{
    public T Count { get; private set; }
    public T Total { get; private set; }
    public T Average { get { return Count / Total; } }
    public T AddDataPoint(T data)
    {
        Total += data;
        Count++;
    }
}

不幸的是,C#无法确定T是否支持+和/运算符,因此无法编译以上代码段。我的下一个想法是将T约束为支持这些运算符的类型,但是我的初步研究表明无法做到这一点。

当然,可以在实现自定义接口的类(例如IMath)中将我要支持的每种类型装箱,并将T限制为该类型,但是此代码将被调用很多次,我想避免装箱开销。

有没有一种优雅而有效的方法来解决此问题而无需代码重复?


阅读 237

收藏
2020-05-19

共1个答案

一尘不染

我最终使用了表达式,这是Marc Gravell概述的一种方法,通过跟随spinon评论的链接找到了。

https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html

2020-05-19