7

メソッドを呼び出して他の実行を行うためにメソッドを受け取る必要があるクラスがあります。これらの方法は、多くの異なるユーザーに対して何度も使用する必要があるため、単純であるほど良い.

これに対処するには、次の 2 つの方法があります。

    void Receive(Action func)
    {
        // Do some things.
        func();
    }

    T Receive<T>(Func<T> func)
    {
        // Do some things.
        return func();
    }

(実際には、定義されたさまざまな Action または Func を受け取ることができる 34 のメソッドがあります。)

次に、任意のメソッドをパラメーターとして Receive 関数に渡して、次のようなことができるようにしたいと考えています。

    void Test()
    {
        Receive(A);
        Receive(B);
    }

    void A()
    {
    }

    int B()
    {
        return 0;
    }

このように、Receive(B) で 1 つのエラーが発生します。

The call is ambiguous between the following methods or properties: 'Class1.Receive(System.Action)' and 'Class1.Receive<int>(System.Func<int>)'

わかりました、署名は同じです (ただし、メソッドを使用しなければエラーは表示されません)。

Receive(Action) メソッドを削除すると、Receive(A) で次のエラーが発生します。

The type arguments for method 'Class1.Receive<T>(System.Func<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

しかし、この場合の私の型は void であり、それをジェネリック パラメーターとして使用することは禁じられています。

では、Action または Func の明示的なキャストを使用せずに Receive メソッドを使用する方法はありますか?

4

2 に答える 2

4

いいえ、これはできません -voidは の有効な戻り値の型ではありませんFunc<T>。あなたができる最善のことは、それを次のようにラップすることですFunc<object>

Receive(() => { A(); return null; });
于 2012-07-10T18:46:01.590 に答える
3

ジェネリック型パラメーターを明示的に指定してみてください。

Receive<int>(B);
于 2012-07-10T18:42:49.317 に答える