Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用泛型类型简化此代码? 私有委托T MyFunc(int i); 私有静态双SumNumber(int i,int n,MyFunc func) { 双和=0.0; 对于(int j=i;i_C#_Generics - Fatal编程技术网

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;
}