2016-03-03 12 views
0

我看到了类似问题的stackoverflow上的一些解决方案,但看起来像每个问题是唯一的。代表'System.Func <int,int,string>'不带1个参数

我想实现全球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"; 
      } 
     } 
    } 
+0

'我被这个错误卡住了'是什么错误? –

+0

这是给编译器错误“委托'System.Func '不带1个参数” –

+0

“我试图实现全球try/catch而不是写每个方法try/catch”。这些都没有任何意义。第一种对于除伐木以外的任何事物都是毫无意义的,因为它太笼统,无法处理发生了什么问题。后者太宽,因为大多数呼叫不应该丢掉,而许多呼叫可以通过轮流给呼叫者来处理。 –

回答

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

编译器无法string GlobalTryCatch<T1>(Func<T1, string> action, T1 i)你原来的方法匹配,因为您的lambda表达式只有一个参数,但该方法的签名要求两个参数。解决方法是使用(x, y),这表示lambda采用两个参数。

作为快捷方式,你可以提供“方法组”,这将导致如下:

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

yeap ..它工作.. –

0

您可能需要考虑处理Application.UnhandledException事件并处理您的异常。

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

1

您可以提供两个参数的函数功能类似这样的

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

有不需要添加lambda表达式。

相关问题