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

时间:2014-02-14 01:14:44

标签: c# visual-studio-2012

我们假设我有以下方法:

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的正确语法是什么?

3 个答案:

答案 0 :(得分:4)

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

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

另一个答案指出,还有Action没有返回值。但是,它与类型签名和语义方面的Func<>方法不兼容。

您可以有两个CallWithSuccessHandler版本:一个版本为Func<>,另一个版本为ActionAction的版本的返回类型为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;
    }
}