C# 10 中对Lambda的语法和类型进行了多项改进:

1. Lambda自然类型

Lambda 表达式现在有时具有“自然”类型。 这意味着编译器通常可以推断出 lambda 表达式的类型。

到目前为止,必须将 lambda 表达式转换为委托或表达式类型。

在大多数情况下,我们会在 BCL 中使用重载的 Func<...> 或 Action<...> 委托类型之一:

从 C# 10 开始,如果 lambda 没有这样的“目标类型”,.NET 将尝试计算一个:

鼠标悬停在 var parse 上,然后查看类型仍然是 Func<int, string>

编译器将使用可用的 Func 或 Action 委托(如果存在合适的委托)。 否则,它将合成一个委托类型.

并非所有 lambda 表达式都有自然类型——有些只是没有足够的类型信息。 例如,放弃参数类型将使编译器无法决定使用哪种委托类型:

lambda 的自然类型意味着它们可以分配给较弱的类型,例如 object 或 Delegate:

当涉及到表达式树时,我们结合了“目标”和“自然”类型。 如果目标类型是 LambdaExpression 或非泛型 Expression(所有表达式树的基类型)并且 lambda 具有自然委托类型 D,将改为生成 Expression<D>:

2. 方法组的自然类型

方法组(即没有参数列表的方法名称)现在有时也具有自然类型。.NET 能够将方法组转换为兼容的委托类型:

现在,如果方法组只有一个重载,它将具有自然类型:

3. Lambda返回类型

在前面的示例中,Lambda表达式的返回类型是显而易见的,并被推断出来的。 但是也有特殊情况:

在 C# 10 中,可以在 lambda 表达式上指定显式返回类型,就像在方法或本地函数上一样。

返回类型在参数之前。

当指定一个显式的返回类型时,参数必须用括号括起来,这样编译器或其他开发人员不会太混淆:

4. Lambda的属性
从 C# 10 开始,可以将属性放在Lambda 表达式上,就像对方法和本地函数一样。 当有属性时,Lambda  的参数列表必须用括号括起来:

就像本地函数一样,如果属性在 AttributeTargets.Method 上有效,则可以将属性应用于 lambda。

Lambda 的调用方式与方法和本地函数不同,因此在调用 lambda 时属性没有任何影响。 但是,lambdas 上的属性对于代码分析仍然有用,并且可以通过反射发现它们。

C#10新特性-lambda 表达式和方法组的改进

周国庆

2022/3/8

C#10新特性-lambda 表达式和方法组的改进的更多相关文章

  1. Java 8 新特性--Lambda表达式作为方法参数

    Lambda表达式的使用场景: 当方法的参数是一个函数式接口时,可以使用Lambda表达式进行简化—— 首先,前提是Runnable接口是一个函数式接口,经过查看源码得知,确实如此: 将Runnabl ...

  2. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  3. Java 8 新特性 - Lambda表达式

    Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析.一个关键的不同点就是关键字 this.匿名类的 this 关键字指向匿名类 ...

  4. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  5. jdk1.8新特性-Lambda表达式使用要点

    前言 在jdk1.8出来的时候看到过,没怎么了解.但是最近再看kafka和spark框架,框架示例中ava版的很多地方用到Lambda表达式,发现使用Lambda表达式代码确实简单了好多,有些例子大致 ...

  6. Java 8新特性--Lambda表达式作为返回值

    lambda表达式作为方法的返回值:

  7. JDK1.8新特性-Lambda表达式

    Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...

  8. jdk8的新特性 Lambda表达式

    很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...

  9. JDK8的新特性——Lambda表达式

    JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. ...

随机推荐

  1. Vulnhub靶机系列之Acid

    Acid 下载地址: ​ https://download.vulnhub.com/acid/Acid.rar ​ https://download.vulnhub.com/acid/Acid.rar ...

  2. 微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析

    目录 前言 1. Sentinel 的自动装配 1.2 依赖引入 1.3 SentinelWebAutoConfiguration 配置类 1.4 CommonFilter 过滤器 1.5 小结 2. ...

  3. 如何在pyqt中给无边框窗口添加DWM环绕阴影

    前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...

  4. Class.getResource和ClassLoader.getResource的路径写法

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...

  5. xcode 常用插件 加快开发速度 --严焕培

    1.KSImageNamed-Xcode 为项目中使用的UIImage的imageNamed提供文件名自动补全功能.使用[UIImage imageNamed:@"xxx"]时,该 ...

  6. 详解Java12新增语法switch表达式

    引言 在学习分支语句的时候,我们都学过 switch 语句,相比于 if-else 语句,他看起来更加整洁,逻辑更加清晰,Java中当然也给我们提了相关的 switch 方法.但是Java的强大之处在 ...

  7. 配置docker的DNS

    方式一:在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS: { "dns" : [ "114.114.114.114 ...

  8. Kubernetes 集群和应用监控方案的设计与实践

    目录 Kubernetes 监控 监控对象 Prometheus 指标 实践 节点监控 部署 Prometheus 部署 Kube State Metrics 部署 Grafana 应用如何接入 Pr ...

  9. jquery-easyui环境的搭建及测试

    对于软件开发者来说,一个良好的前端框架不仅能够使页面优美可观而且还能够大大的提高开发效率.提高系统整体界面的美观,框架将常用的功能封装完成,减少工作量.前端框架目前也比较多,小编本次主要介绍下easy ...

  10. Java架构师必备技能:docker使用大全

    前言   java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...