在新开关 c# 8.0 中使用 lambda 函数返回值

Posted

技术标签:

【中文标题】在新开关 c# 8.0 中使用 lambda 函数返回值【英文标题】:Use lambda function in new switch c# 8.0 to return value 【发布时间】:2020-12-08 06:13:32 【问题描述】:

我想在我的代码中使用新开关,用于方法结果生成日志并返回IActionResult

我尝试做这样的事情:

var response = (this._coreRepository.Write(value.Content, data.Id.ToString())); \\return bool
return response switch

   true => () =>
   
      this._log.LogInformation("Write is complited");
      return Ok();
   ,
   false => () =>
   
      this._log.LogInformation("Error in writing");
      return BadRequest();
   ,
   _     => () =>
   
      throw new Exception("Unexpected error");
   
;

但是编译器告诉我cannot convert lambda expression to type 'IActionResult' because it is not a delegate type

我该如何解决?

【问题讨论】:

【参考方案1】:

问题是你的 switch 表达式返回一个lambda expression,但包含方法需要IActionResult。要解决此问题,您应该重写 return 语句以立即调用 switch 表达式的结果:

var response = (this._coreRepository.Write(value.Content, data.Id.ToString()));

return (response switch

   // Here we cast lambda expression to Func<IActionResult> so that compiler
   // can define the type of the switch expression as Func<IActionResult>.
   true => (Func<IActionResult>) (() =>
   
      this._log.LogInformation("Write is complited");
      return Ok();
   ),
   false => () =>
   
      this._log.LogInformation("Error in writing");
      return BadRequest();
   ,
   _     => () =>
   
      throw new Exception("Unexpected error");
   
)(); // () - here we invoke Func<IActionResult>, the result of the switch expression.

如果我是你,我会改写这段代码以使其更易于阅读:

var response = (this._coreRepository.Write(value.Content, data.Id.ToString()));

// Now additional braces or casts are not required.
Func<IActionResult> func = response switch

   true => () =>
   
      this._log.LogInformation("Write is complited");
      return Ok();
   ,
   false => () =>
   
      this._log.LogInformation("Error in writing");
      return BadRequest();
   ,
   _     => () =>
   
      throw new Exception("Unexpected error");
   


return func();

【讨论】:

以上是关于在新开关 c# 8.0 中使用 lambda 函数返回值的主要内容,如果未能解决你的问题,请参考以下文章

c# 8.0 switch 表达式返回类型和空值

C# 中的本地函数

我们可以使用 lambda 函数克隆一个终止的 emr 集群吗?在新集群中会有任何差异吗?

c# 8.0 switch 表达式中的多个案例[重复]

C# 使用 AWS lambda 时,我可以确定函数中的析构函数会被执行吗?

C#中的lambda表达式