我们假设我有以下方法:
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&lt; void&gt;”。
返回“无”的Func的正确语法是什么?
答案 0 :(得分:4)
Func<>
定义了一个返回某个东西的函数。你不能告诉它什么也不返回,因为这没有意义。使用委托的代码需要一个值(即,您的CallWithSuccessHandler
,它必须返回函数的结果)并且根据定义,void不能是值。
你可以返回一个虚拟值,也许是一个布尔值,但你必须返回一些东西。
另一个答案指出,还有Action
没有返回值。但是,它与类型签名和语义方面的Func<>
方法不兼容。
您可以有两个CallWithSuccessHandler
版本:一个版本为Func<>
,另一个版本为Action
。 Action
的版本的返回类型为void。
答案 1 :(得分:1)
返回类型为void
的函数不会返回任何内容。如果您想要一个引用不返回任何内容的方法的委托,那么您使用Action
而不是Func<TResult>
。
答案 2 :(得分:0)
看看这个: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;
}
}