8

I have the following two functions, that are nearly identical, the only difference is that one uses func, the other action. And I'd like to combine them into one function if it is possible.

    private static void TryCatch(Action action)
    {
        try
        {
            action();
        }
        catch (Exception x)
        {
            Emailer.LogError(x);
            throw;
        }
    }

    private static TResult TryCatch<TResult>(Func<TResult> func)
    {
        try
        {
            return func();
        }
        catch (Exception x)
        {
            Emailer.LogError(x);
            throw;
        }
    }
4

3 回答 3

4

在 C# 中将这两者组合成一个函数确实是不可能的。C# 和 CLR 中的void根本不是类型,因此具有与非 void 函数不同的返回语义。正确实现这种模式的唯一方法是为 void 和非 void 委托提供重载

CLR 限制并不意味着不可能在每种 CLR 语言中都这样做。void在用于表示不返回值的函数的语言中,这是不可能的。这种模式在 F# 中非常可行,因为它使用Unit而不是voidfor 无法返回值的方法。

于 2012-06-04T16:24:40.453 回答
4

您可以使用第二个Func<T>版本来实现该Action方法,只需将 Action 包装在 lambda 中。这消除了一些重复的代码。

private static void TryCatch(Action action)
{
    Func<object> fun => 
       {
           action();
           return null;
       };
    TryCatch(fun);
}

话虽这么说,这样做会涉及额外的开销,所以就个人而言,我可能会按照您当前实现它的方式保留它(特别是考虑到在这种情况下您的原始版本恰好是多么简短和简单)。

于 2012-06-04T16:25:08.360 回答
1

我按照@ReedCopsey 的建议这样做。

这是我发现的最简单的语法:

private static void TryCatch( Action action )
{
    TryCatch( () => { action(); return 0; } );
}
于 2012-06-04T16:32:42.773 回答