C# 如何使用泛型类型简化此代码? 私有委托T MyFunc(int i); 私有静态双SumNumber(int i,int n,MyFunc func) { 双和=0.0; 对于(int j=i;i
首先,请注意,在许多方面,非泛型重载版本更简单。泛型不支持运算符,接口也不支持 事实上,如果您的类型有可用的C# 如何使用泛型类型简化此代码? 私有委托T MyFunc(int i); 私有静态双SumNumber(int i,int n,MyFunc func) { 双和=0.0; 对于(int j=i;i,c#,generics,C#,Generics,首先,请注意,在许多方面,非泛型重载版本更简单。泛型不支持运算符,接口也不支持 事实上,如果您的类型有可用的Sum方法(可能通过IEnumerable上的扩展方法),调用方可以简单地使用: interface IAddable<T> { static T operator +(T x, T y); } 其中,projection在道德上等同于func 为了按照自己的方式进行,您可以先尝试动态: var data = sourceData.Select(projection)
Sum
方法(可能通过IEnumerable
上的扩展方法),调用方可以简单地使用:
interface IAddable<T>
{
static T operator +(T x, T y);
}
其中,projection
在道德上等同于func
为了按照自己的方式进行,您可以先尝试动态:
var data = sourceData.Select(projection).Sum();
private static T Sum(int i,int n,Func Func)
{
如果(i>=n)抛出新ArgumentOutOfRangeException();
T和=func(i);
对于(int j=i+1;i@Jon在查找MiscUtil链接时击败了我;p可以将dynamic
类型的对象隐式转换为T
类型的对象吗?我的意思是,您是否应该改为编写:sum=(T)((dynamic)sum+(dynamic)func(j))
@Nawaz动态
可以隐式转换为任何内容,但请注意,检查是在运行时进行的;其中有一个很大的假设:存在一个定义的操作符+(T,T)
,它返回T
@marcGravel:我正要发布一个非常类似的答案,所以我碰巧准备好了:)@Nawaz-your(T)
添加也很有意义,可以说可以让意图更清晰;结果是一样的,我当然不会反对在那里添加额外的(T)
。您可以使用Func而不是MyFunc,这样您就不必创建委托并使用.net中的委托
var data = sourceData.Select(projection).Sum();
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;
}