2017-06-21 84 views
2

我使用別人的實用方法,它似乎使用lambda表達式語法,我有麻煩閱讀。一個參數被定義Lambda函數的身體用括號括起來?

Func<Action<int>, Action<Exception>, EventHandler<CustomEventArgs>> getCompleteHandler 

與函數功能的原型是

delegate TResult System.Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2) 

在該示例代碼,該方法被調用:

getCompleteHandler: (Action<int> complete, Action<Exception> reject) => 
         (
         (object sender, CustomEventArgs args) => 
         { 
          complete(args.IntVar); 
         } 
        ) 

在呼叫中,括號中的第二行直接跟隨第一個lambda運算符,包含內部lambda。我還沒有在其他地方看過這種語法,但是有一個完整的lambda表達式,我只希望看到類型轉換和方法體。內部lambda代表getCompleteHandler是什麼?

回答

0

x = 1; x = (1); x = ((1)); x = ..

(分組)括號被有效地忽略。編碼員可能選擇了語法,因爲它增加了他/她的清晰度或者符合某種約定;括號的這種用法根本不會改變解析或語義。

就我個人而言,我不會添加括號。


評價外λ-AS-Func鍵返回內λ-AS-行動,過complete形成的封閉件。返回的Action將在稍後評估。

試想:

// -> Func<Action<int>, Action<Exception>,  // arguments 
//   Action<object, CustomEventArgs>>  // return value 
var getCompleteHandler = /* that */ 

// create the completion handler by invoking the "get" function 
// -> Action<object, CustomEventArgs>   // same as return value 
var completionHandler = getCompletionHandler(
    (x) => Console.WriteLine(x), 
    (ex) => Console.WriteLine("Exception!: " + ex)); 

// call the completion handler any number of times.. 
foreach (var i in Enumerable.Range(42)) { 
    completionHandler(this, new CustomEventArgs { IntVar = i }); 
}