gpt4 book ai didi

c# - Action 和 Func 都没有显式转换

转载 作者:太空狗 更新时间:2023-10-29 20:21:16 24 4
gpt4 key购买 nike

我有一个类必须接收方法才能调用它们以及执行其他操作。这些方法必须针对许多不同的用户多次使用,因此越简单越好。

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

    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.

但是我这种情况下的类型是void,禁止作为泛型参数使用。

那么,有没有一种方法可以让我的 Receive 方法不使用 Action 或 Func 的任何显式转换?

最佳答案

不,你不能这样做 - void不是 Func<T> 的有效返回类型.您能做的最好的事情就是将它包装在 Func<object> 中。 :

Receive(() => { A(); return null; });

关于c# - Action 和 Func<T> 都没有显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11419716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com