假设我有以下方法:
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<>
,另一个采用Action
。Action
的版本将具有 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;
}
}