通用委托实现

时间:2012-10-15 02:43:11

标签: c# generics delegates

我正在尝试解决以下问题

声明一个泛型委托类型Action,返回类型为void,并将T值作为参数。这是昨天的委托类型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的概括。

有人可以帮助我吗:)

3 个答案:

答案 0 :(得分:2)

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

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

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

<强> EDITED

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

答案 1 :(得分:1)

如果您更改了

,该怎么办?
arr[i] = act(arr[i]);

act(arr[i]);

请记住,act会返回void,因此您没有要分配的返回值。

  

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

这可能与您使用Action<int> act而不是Action<T> act的方法类似。

修改 当然,arr的迭代应该是:

for (T obj in arr) 
{ 
    act(obj); 
} 

答案 2 :(得分:1)

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

您的教练很可能会将其声明如下:

public delegate void IntAction(int input);

因此它代表一种接收int并返回void的方法。为了概括这一点,您的家庭作业要求您对这样的代表进行概括。它希望您创建一个方法,该方法接受任何类型的对象,假设类型为T,并返回void。这确实是你使用过的委托System.Action,但我认为你的作业要求你去DECLARE那个委托类型。这就是你如何做到的(我称之为代理GenericAction,你将以与使用Action完全相同的方式使用它):

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

你的foreach循环中有一个错误。您正在尝试将委托的结果分配给数组中的元素。但委托Action返回void!

修复此更改

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.

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