private delegate T MyFunc<T>(int i);
private static double SumNumber(int i, int n, MyFunc<double> func)
{
double sum = 0.0;
for (int j = i; i <= n; j++)
{
sum += func(j);
}
return sum;
}
private static Vector SumVector(int i, int n, MyFunc<Vector> func)
{
Vector sum = new Vector(0.0, 0.0);
for (int j = i; i <= n; j++)
{
sum += func(j);
}
return sum;
}
这是一个计算MyFunc(j)之和的程序,其中j是i到n。
我尝试使用如下界面:
interface IAddable<T>
{
static T operator +(T x, T y);
}
但它不起作用。
那我该怎么办?
答案 0 :(得分:6)
首先请注意,在许多方面,非泛型过载版本更简单。泛型不支持运算符,也不支持接口。
的确,如果 Sum
方法可用于您的类型(可能通过IEnumerable<T>
上的扩展方法),调用者可以使用:
var data = sourceData.Select(projection).Sum();
其中projection
是func
的道德等价物。
为了实现您的方式,您可能首先尝试的是dynamic
:
private static T Sum<T>(int i, int n, Func<int,T> func)
{
if(i >= n) throw new ArgumentOutOfRangeException();
T sum = func(i);
for (int j = i + 1; i <= n; j++)
{
sum = (dynamic)sum + (dynamic)func(j);
}
return sum;
}
否则,你可以做一些伪造泛型运算符的技巧(参见MiscUtil),或者你可以传递累加器方法(即Func<T,T,T> add
)作为参数。