用括号括起来的 Lambda 函数的主体?



我正在使用其他人的实用程序方法,它似乎使用了我在阅读时遇到问题的lambda表达式语法。定义了参数

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

与 Func 的原型是

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 表示什么?

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

(分组(括号被有效忽略。编码人员选择语法可能是因为它增加了清晰度(对他/她(或以其他方式符合某些约定;括号的这种使用根本不会改变解析或语义。

就个人而言,我不会添加括号。


评估外部 lambda-as-Func 返回内部 lambda-as-Action,形成complete的闭包。稍后将评估返回的操作。

想象:

// -> 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 });
}

相关内容

最新更新