0

次の問題を解決しようとしています

戻り値の型が void で、引数としてT値を取るジェネリック デリゲート型 Action を宣言します。これは、昨日のデリゲート型の一般化ですIntAction。メソッドを持つクラスを宣言する

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

このメソッドは、デリゲート アクトを配列 arr のすべての要素に適用する必要があります。foreachmethod を実装するときにステートメントを使用し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

アクションには戻り値の型がないため、同様のことはできません

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

act返すvoidので、割り当てる戻り値がないことに注意してください。

これは、昨日のデリゲート型 IntAction の一般化です。

Action<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。これを一般化するために、YOUR HOMEWORK では、そのようなデリゲートを一般化するよう求めています。ANY TYPE (タイプ T としましょう) のオブジェクトを受け取り、void を返すメソッドを作成する必要があります。それは確かにあなたが使用したデリゲート System.Action ですが、宿題だと思いますが、そのデリゲート タイプを DECLARE するように求められます。これはあなたがそれを行う方法です (デリゲート GenericAction を呼び出しましたが、Action を使用するのとまったく同じ方法で使用します)。

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

foreach ループに間違いがあります。デリゲートを適用した結果を配列内の要素に代入しようとしています。しかし、デリゲート アクションは 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.

さらに明確にする必要がある場合は、質問やコメントを自由に変更してください。

于 2012-10-15T02:56:42.800 に答える