0

我正在尝试解决以下问题

声明一个具有返回类型 void 并将T值作为参数的通用委托类型 Action。这是昨天的委托类型的概括IntAction。声明一个有方法的类

static void Perform<T>(Action<T> act, params T[] arr) { ... }

此方法应将委托行为应用于数组 arr 的每个元素。实现方法时使用该foreach语句Perform<T>

到目前为止,我的代码如下所示:

namespace CSharpexercices
{
    public delegate void Action<T>(T value);

    public class GenericDelegate
    {
        static void Perform<T>(Action<T> act, params T[] arr)
        {
            foreach (T i in arr)
            {
               act(arr[i]);
            }
        }
    }
}

它不能正常工作,我迷失了“这是昨天的委托类型 IntAction 的概括。

有人可以帮助我吗:)

4

3 回答 3

2

Action 没有返回类型,所以你不能做任何类似的事情

arr[i] = act(arr[i]);

其次,您不能在 foreach 中迭代 int 数据类型。

已编辑

public delegate void Action<T>(T value);

public class GenericDelegate
{
    static void Perform<T>(Action<T> act, params T[] arr)
    {
        foreach (T obj in arr)
        {
            act(obj);
        }
    }
}
于 2012-10-15T02:53:59.567 回答
1

如果你改变了怎么办

arr[i] = act(arr[i]);

act(arr[i]);

请记住return ,因此您没有要分配的返回值actvoid

这是昨天的委托类型 IntAction 的概括。

这可能指的是一种类似的方法,您调用的是 anAction<int> act而不是Action<T> act.

编辑: 当然,迭代arr应该是:

for (T obj in arr) 
{ 
    act(obj); 
} 
于 2012-10-15T02:52:00.777 回答
1

IntAction 是委托类型(表示对方法的引用的类型,如 C++ 中的函数指针)。

您的教练很可能是这样声明的:

public delegate void IntAction(int input);

因此它代表了一个接受int并返回的方法void。为了概括这一点,你的家庭作业要求你对这样的代表进行概括。它希望您创建一个方法,该方法采用 ANY TYPE 的对象,比如说类型 T,并返回 void。这确实是您使用的委托 System.Action,但我认为您的作业要求您声明该委托类型。这就是你的做法(我调用了委托 GenericAction,你会以与使用 Action 完全相同的方式使用它):

public delegate void GenericAction<T>(T input);

您的 foreach 循环中有错误。您正在尝试将应用委托的结果分配给数组中的元素。但是委托动作返回无效!

修复此更改

arr [i] =  act (arr[i]);

act (i); //you can't use the result of applying act to i (because it's void) so just leave it.

如果您需要更多说明,请随时修改您的问题或评论。

于 2012-10-15T02:56:42.800 回答