注意
本文是特性规范。 该规范充当该功能的设计文档。 它包括建议的规范更改,以及功能设计和开发过程中所需的信息。 这些文章将发布,直到建议的规范更改最终确定并合并到当前的 ECMA 规范中。
功能规范与已完成的实现之间可能存在一些差异。 这些差异记录在相关的语言设计会议 (LDM) 说明中。
可以在 规范一文中详细了解将功能规范采用 C# 语言标准的过程。
支持者问题:https://github.com/dotnet/csharplang/issues/275
总结
允许在 lambda 和匿名方法上使用“静态”修饰符,这不允许从包含范围捕获本地或实例状态。
动机
避免无意中从封闭上下文中捕获状态,这可能会导致意外保留捕获的对象或意外的额外分配。
详细设计
lambda 或匿名方法可能有 static 修饰符。
static 修饰符指示 lambda 或匿名方法是 静态匿名函数。
静态匿名函数 无法从封闭范围捕获状态。
因此,封闭范围内的局部变量、参数和 this,不可在 静态匿名函数中使用。
静态匿名函数 无法从隐式或显式 this 或 base 引用实例成员。
静态匿名函数 可以从封闭范围引用 static 成员。
静态匿名函数 可以从封闭范围引用 constant 定义。
nameof()中的 可以从封闭范围引用局部变量、参数或 this 或 base。
封闭作用域中 private 成员的可访问性规则对于 static 和非static 匿名函数是相同的。
无法保证静态匿名函数定义是否在元数据中作为 static 方法发出。 这留给编译器实现进行优化。
非static 本地函数或匿名函数可以从封闭 静态匿名函数 捕获状态,但无法捕获封闭 静态匿名函数之外的状态。
从有效程序中的匿名函数中删除 static 修饰符不会更改程序的含义。