C#10新特性-lambda 表达式和方法组的改进
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 表达式和方法组的改进的更多相关文章
- Java 8 新特性--Lambda表达式作为方法参数
Lambda表达式的使用场景: 当方法的参数是一个函数式接口时,可以使用Lambda表达式进行简化—— 首先,前提是Runnable接口是一个函数式接口,经过查看源码得知,确实如此: 将Runnabl ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- Java 8 新特性 - Lambda表达式
Lambda表达式 vs 匿名类既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析.一个关键的不同点就是关键字 this.匿名类的 this 关键字指向匿名类 ...
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- jdk1.8新特性-Lambda表达式使用要点
前言 在jdk1.8出来的时候看到过,没怎么了解.但是最近再看kafka和spark框架,框架示例中ava版的很多地方用到Lambda表达式,发现使用Lambda表达式代码确实简单了好多,有些例子大致 ...
- Java 8新特性--Lambda表达式作为返回值
lambda表达式作为方法的返回值:
- JDK1.8新特性-Lambda表达式
Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...
- jdk8的新特性 Lambda表达式
很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...
- JDK8的新特性——Lambda表达式
JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. ...
随机推荐
- JavaScript之Promise实现原理(手写简易版本 MPromise)
手写 Promise 实现 Promise的基本使用 Promise定义及用法详情文档:Promise MAD文档 function testPromise(param) { return new P ...
- 女朋友让我深夜十二点催她睡觉,我有Python我就不干
事情是这样的:今天晚上,女朋友让我十二点催她睡觉. 不过,可是我实在太困了,熬不下去-- 是吧?女朋友哪有睡觉重要? 但,女朋友的命令,我是不敢违抗的-- 但是睡觉也不能缺! 这时候我们该怎么办呢?是 ...
- Net6 DI源码分析Part2 Engine,ServiceProvider
ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...
- 「CTSC 2011」排列
「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...
- Swift中数据类型
Swift类型的介绍 Swift中的数据类型也有:整型/浮点型/对象类型/结构体类型等等 先了解整型和浮点型 整型 有符号 Int8 : 有符号8位整型 Int16 : 有符号16位整型 Int32 ...
- Eclipse不能启动,提示:The Eclipse executable launcher was unable to locate its companion launcher jar
原因分析:JDK版本与eclipse不匹配 如jdk和eclipse版本号必须统一,64位都是64位,32位都是32位. jdk版本可以用命令,cmd进入命令窗口,然后输入java -version, ...
- CABasicAnimation动画
使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...
- Pandas之isna,fillna
isna() 释义 筛选为NaN的布尔值,可接受单个标量或者数组 举例 筛选stu_name为NaN的所有行: df = pd.DataFrame({'stu_name': ['Tom', 'Tony ...
- Hibernate处理MySQL的时间
如果Java使用使用 java.util.Date 作为持久化对象属性,在 Mysql 中使用 YEAR.DATE.TIME.TIMESTAMP.DATETIME 五种类型 则需要添加@Tempora ...
- 深度学习:多层感知机和异或问题(Pytorch实现)
感知机模型 假设输入空间\(\mathcal{X}\subseteq \textbf{R}^n\),输出空间是\(\mathcal{Y}=\{-1,+1\}\).输入\(\textbf{x}\in \ ...