委托'System.Func <int,int,string>'不带1个参数

时间:2016-03-03 23:26:19

标签: c# linq lambda

我在stackoverflow上看到了类似问题的一些解决方案,但看起来每个问题都是唯一的。

我正在尝试实现全局try / catch而不是在每个方法上编写try / catch但是我遇到了这个错误。它适用于一个参数,而不适用于采用多个参数的方法。

class Program
    {
        static void Main(string[] args)
        {  
            int i = 5;
            int j = 10;
            string s1 = GlobalTryCatch(x => square(i), i);
            string s2 = GlobalTryCatch(x => Sum(i,j), i, j); // error here..

            Console.Read();
        }

        private static string square(int i)
        {
            Console.WriteLine(i * i);
            return "1";
        }

        private static string Sum(int i, int j)
        {
            Console.WriteLine(i+j);
            return "1";
        }

        private static string GlobalTryCatch<T1>(Func<T1, string> action, T1 i)
        {
            try
            {
                action.Invoke(i);
                return "success";
            }
            catch (Exception e)
            {
                return "failure";
            }
        }

        private static string GlobalTryCatch<T1, T2>(Func<T1, T2, string> action, T1 i, T2 j)
        {
            try
            {
                action.Invoke(i, j);
                return "success";
            }
            catch (Exception e)
            {
                return "failure";
            }
        }
    }   

3 个答案:

答案 0 :(得分:3)

string s2 = GlobalTryCatch((x, y) => Sum(i, j), i, j);

编译器无法将原始方法与string GlobalTryCatch<T1>(Func<T1, string> action, T1 i)匹配,因为lambda表达式只有一个参数,但方法签名需要两个参数。修复是使用(x, y),这表示lambda有两个参数。

作为一种快捷方式,您只需提供&#34;方法组&#34;,这将产生以下结果:

string s2 = GlobalTryCatch(Sum, i, j);

答案 1 :(得分:1)

您可以像这样提供双参数Func

string s2 = GlobalTryCatch(Sum, i, j); // error here..

无需添加lambda表达式。

答案 2 :(得分:0)

您可能需要考虑处理Application.UnhandledException事件并在那里处理您的例外情况。

您的方法签名有所不同。这就是为什么你不能使用GlobalTryCatch的单一实现。