这个问题已经在这里有了答案 :
是否存在将我的通用方法限制为数字类型的约束? (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限制为该类型,但是此代码将被调用很多次,我想避免装箱开销。
有没有一种优雅而有效的方法来解决此问题而无需代码重复?
我最终使用了表达式,这是Marc Gravell概述的一种方法,通过跟随spinon评论的链接找到了。
https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html