c# - 通用 C# 代码和加号运算符

标签 c# generics math

<分区>

我正在编写一个类,该类对 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 以及可能定义运算符 + 和运算符/的其他类的相同操作,我的第一个想法是简单地使用泛型:

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 限制为支持这些运算符的类型,但我的初步研究表明这是不可能的。

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

有没有一种优雅高效的方法来解决这个问题而不重复代码?

最佳答案

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

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

关于c# - 通用 C# 代码和加号运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039694/

相关文章:

java - 如何将类范围的类型参数限制为原始包装器(数字)和字符串?

javascript - 找到适合网格系统的所有矩形

javascript - 从 Ajax 调用内容时,JQuery .on 不起作用

c# - 为什么在 GetCurrent 之前调用 IEnumerator.MoveNext?

c# - 给定总分区数和分区数对列表进行分区

java - 声明泛型

c# - 如何从嵌套母版页中的内容页访问主母版页中的控件

java - 获取类类型为特定类

algorithm - 查找最近点对应于散点图中的给定点

objective-c - "double"在 ceil(double) 中做什么?