尝试声明 Func <void>时,不能在此上下文中使用关键字 'void'



假设我有以下方法:

private TResult CallWithSuccessHandler<TResult>(Func<TResult> func, System.Action onSuccess = null, System.Action onFailure = null)
{
    try
    {
        var result = func();
        if (onSuccess != null) onSuccess();
        return result;
    }
    catch (Exception ex)
    {
        if (onFailure != null) onFailure();
        throw;
    }
}

我可以像这样调用此方法:

var simpleFunc = new Func<int>(() => { return 1; });
var result = CallWithSuccessHandler(simpleFunc, null, null);

这在Visual Studio中编译没有任何问题,并且工作正常。

但是,我无法弄清楚的是如何使用不返回任何内容的"Func"调用 CallwithSucessHandler 方法。换句话说,我需要"func"来返回"void"。

我尝试了以下操作:

var voidFunc = new Func<void>(() => { return; });
CallWithSuccessHandler(voidFunc, null, null);

但Visual Studio拒绝编译并显示以下错误消息:

"Keyword 'void' cannot be used in this context"

具体来说,Visual Studio不喜欢"new Func "。

返回"无"的 Func 的正确语法是什么?

>Func<>定义了一个返回某些内容的函数。你不能告诉它什么都不返回,因为这没有意义。使用委托的代码需要一个值(即你的CallWithSuccessHandler,它必须返回函数的结果),而 void 根据定义不能是一个值。

你可以返回一个虚拟值,也许是一个布尔值,但你必须返回一些东西。

正如另一个答案所指出的,还有不返回值的Action。但是,它与采用Func<>的方法不兼容,无论是在类型签名还是在语义方面。

您可以有两个版本的CallWithSuccessHandler:一个采用Func<>,另一个采用ActionAction的版本将具有 void 的返回类型。

返回

类型为 void 的函数不返回任何内容。 如果你想要一个引用不返回任何内容的方法的委托,那么你使用 Action 而不是 Func<TResult>

看看这个:var result = func(),当TResult无效时,var result会是什么?它怎么能运行return result

您只能定义另一个函数,例如:

private void CallWithSuccessHandler(System.Action action, System.Action onSuccess = null, System.Action onFailure = null)
{
    try
    {
        action();
        onSuccess();
    }
    catch (Exception ex)
    {
        if (onFailure != null) onFailure();
        throw;
    }
}

相关内容

最新更新