1

目标是创建一个简单的程序来计算预处理集的总和。必须是通用的Sum以允许它接受整数和浮点集。

以下代码无法编译。你能告诉我如何解决吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{

    static class Program
    {
        delegate T del<T>(T x);
        static T Sum<T>(del<T> df, IEnumerable<T> data)
        {
            T s = 0;
            foreach (var x in data) s += df(x);
            return s;
        }

        static void Main(string[] args)
        {
            var data = Enumerable.Range(1, 4);
            int sum = Sum<int>(x => x * x, data);
            Console.WriteLine(sum);
        }
    }
}

错误消息(粗略地说):

  1. 无法转换intT.
  2. +=不适用于T
4

4 回答 4

3

忽略代码的其他问题,您将无法做您想做的事情。C# 不支持泛型类型的算术运算符。

因此,一种选择是 to Sum(del<int>, ..), Sum(del<float>, ...).. 等。

或者,使用dynamic

delegate T del<T>(T x);
static T Sum<T>(del<T> df, IEnumerable<T> data) 
{
    dynamic s = default(T);
    foreach (var x in data) s += df(x);
    return s;
}

此结果适用30于您提供的示例。

于 2013-09-05T02:51:14.190 回答
1

您可以使用此处Add()定义的通用方法。

诀窍是将初始值s作为类型传递TSum()方法,而不是在函数内部对其进行初始化。

public class Program
{
    public static T Add<T>(T a, T b)
    {
        var paramA = Expression.Parameter(typeof (T), "a");
        var paramB = Expression.Parameter(typeof (T), "b");
        var body = Expression.Add(paramA, paramB);
        var add = Expression.Lambda<Func<T, T, T>>(body, paramA, paramB).Compile();
        return add(a, b);
    }

    public delegate T del<T>(T x);

    //pass the variable s into the function instead of initializing it inside the function.
    public static T Sum<T>(T s, del<T> df, IEnumerable<T> data)
    {
        return data.Aggregate(s, (current, x) => Add(current, df(x)));
    }

    public static void Main(string[] args)
    {
        var data = Enumerable.Range(1, 4);
        int sum = Sum(0, x => x * x, data);
        Console.WriteLine(sum);
    }
}
于 2013-09-05T03:16:57.417 回答
0

您需要使用default关键字,特别是:

// was: T s = 0;
T s = default(T);

我匆忙回答了标题中的问题,关于在泛型之间执行添加操作的次要问题,这已经在另一个 StackOverflow问题中有所涉及,所以我不会重复发布。它涉及 using dynamic,这意味着您不再具有编译时安全性。阅读其他问题了解更多详情。

于 2013-09-05T02:46:51.520 回答
0

非常类似于西蒙怀特黑德的回答

    static T Sum<T>(del<T> df, dynamic data)
    {
        T s = default(T);
        foreach (var x in data) s += df(x);
        return s;
    }

这个回报也是30

于 2013-09-05T03:23:57.350 回答