【问题标题】:Why are parentheses needed around this lambda function?为什么这个 lambda 函数需要括号?
【发布时间】:2017-02-01 17:43:25
【问题描述】:
return (Func<object, Task<object>>)(async (dynamic data) =>
{
    methodCall(data.data, data.more);
    return null;
});

根据我收集到的上述代码正在执行的操作,它将 lambda 函数显式转换为委托,然后返回该委托(在本例中,它返回到 edgejs 函数)。

删除括号后,从构建过程中收到 8 个错误。

语法错误,应为“,”

;预计

} 预期

名称 async 在当前上下文中不存在

名称动态在当前上下文中不存在

当前上下文中不存在名称数据

当前上下文中不存在名称数据

当前上下文中不存在名称数据

【问题讨论】:

  • 把它们拿出来看看它是否编译...(提示 - 它没有!)
  • @RB.:从问题的标题来看,我认为他们已经这样做了。
  • 哦,很公平,在这种情况下,它是为了确保强制转换在完整的 lambda 函数上运行。
  • @RB 啊,好吧,那是有道理的。感谢那。此外,我将解决这个问题,使其看起来更好,更简洁
  • @Scott Mermelstein:建议的编辑是正确的。 -es 是复数; -is 是单数。

标签: c# node.js lambda edgejs


【解决方案1】:

可能是因为 async is a contextual keyword 只有在作为修饰符出现在方法或 lambda 签名中时才具有特殊含义。如果没有括号,解析器会认为 async 是一个方法名称,从而导致错误,因为编译器找不到具有该名称的方法(此外,=&gt; 上的解析错误,因为解析器不再使用lambda 表达式)。

【讨论】:

  • 啊,好吧。这是有道理的。感谢你的回答! .Net 中的异步相对较新,因此可以很好地清除所有内容。没有意识到 async 是一个上下文关键字。
  • 它是上下文相关的,因此在过去十年中使用async 作为变量名的任何人都不会在升级后突然代码中断。
  • @Robocrypt 将关键字添加到现有语言是一件微妙的事情,因为它是一个突破性的变化。这就是为什么新功能通常会尝试重用现有关键字或将上下文关键字与使破坏现有代码的可能性不存在或非常低的语法结合使用。前者的示例:inout 和后者的示例:yieldasyncawaitvar
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 2017-11-07
  • 2019-11-13
  • 2020-11-15
  • 2012-08-03
  • 2014-08-09
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多