7

我有一个类必须接收方法才能调用它们以及执行其他执行。这些方法必须多次使用,并且适用于许多不同的用户,所以越简单越好。

为了解决这个问题,我有两种方法:

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

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

(实际上我有 34 种方法可以接收定义的任何不同的 Action 或 Func。)

然后,我希望能够将任何方法作为参数传递给 Receive 函数,以便能够执行以下操作:

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

    void A()
    {
    }

    int B()
    {
        return 0;
    }

就像这样,它在 Receive(B) 中给了我一个错误:

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.

但是在这种情况下我的类型是无效的,并且禁止将其用作泛型参数。

那么,有没有办法让我的 Receive 方法不使用任何明确的 Action 或 Func 转换?

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 回答