2012-10-15 116 views
0

我试图解决以下问题泛型委托执行

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

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

该方法应适用的委托行为到阵列ARR的每个元素的类。在实施方法Perform<T>时使用foreach声明。

我的代码看起来像这样至今:

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的推广

有人能帮助我漂亮。请:)

+0

你可以用你用来调用'Perform'的代码编辑你的问题吗? –

回答

1

IntAction是委托类型(表示一个参照本发明的方法,如在C++函数指针一个类型)。

最有可能你的导师声明,如下所示:

public delegate void IntAction(int input); 

随着因此表示需要在int并返回void的方法。为了概括这一点,您的家庭要求您对此类代表进行概括。它希望你创建一个接受任何类型对象的方法,比如说类型T,并返回void。这确实是像你使用的委托System.Action,但我认为你的功课要求你声明委托类型。这是你如何做到这一点(我所谓的委托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. 

随意修改你的问题,或者如果你需要更多的澄清评论。

+0

我不会为这个MZN上学,我不以任何方式作弊,只是试图理解,因为我被卡住了。 –

+0

哈哈,它看起来很像家庭作业。对不起,我只是在开玩笑。这个答案虽然有帮助吗? – Mzn

+0

:)我发现在线练习表,不要感到抱歉,谢谢你的帮助:P –

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

我不认为你的编辑是@FurganSafdar的意思 - 'foreach'比'for for'好得多,尤其是因为它避免了在循环中使用'.Count()'。 –

+0

@JamesD'Angelo我想我会做另一次编辑 - 编辑最初是为了回应我没有掩盖foreach循环这个问题上的错误。 –

+0

不用担心。很好的修复! –

2

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

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

其次,你不能重复INT数据类型在foreach中。

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

或'foreach(arb中的T obj){act(obj); }' – Tanzelax

+0

是的,也可以做到。 –

+1

我会避免在'for'循环中使用'.Count()'。 (请参阅[本文](http://blogs.msdn.com/b/abhinaba/archive/2008/05/18/8517197.aspx)以获取更多信息。) –