我正在尝试解决以下问题
声明一个泛型委托类型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的概括。
有人可以帮助我吗:)
答案 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.
如果您需要更多说明,请随时修改您的问题或评论。