.NET 6 预览了一项新功能,其中 static
接口成员可以标记为 abstract
。 此功能涉及对 ECMA 335 规范的多项更改,以允许以前被视为非法的中间语言(IL)元数据模式。 有关详细信息,请参阅 dotnet/runtime#49558。
旧行为
如果静态接口被标记为 abstract
:
- C# 编译器生成 了错误 CS0112。
- 工具和其他编译器生成了非法 IL 元数据。
新行为
从 .NET 6 开始,静态接口成员可以标记为 abstract
,然后成功地编译。 此外,由于 ECMA 335 规范的变化,生成的 IL 元数据模式现在被视为合法模式。
static abstract
接口成员的实现由实现接口的类型提供。
注释
对于 .NET 6,必须启用项目中的 预览功能 才能将接口成员 static abstract
标记为 。
由于这是一种新合法的 IL 模式,因此现有工具可能会错误地处理关联的元数据并出现意外行为。 工具可能会遇到新的元数据模式,因为具有 static abstract
成员的接口现在显示在基元类型上,例如 System.Int32。
已引入的版本
.NET 6
破坏性变更的类型
此更改可能会影响 二进制兼容性。
更改原因
引入了此更改,因为无法对静态成员进行抽象化,并编写适用于定义这些静态成员的类型的通用代码。 对于仅存在于静态形式的成员类型(例如运算符)中,这尤其有问题。
建议的措施
更新任何使用 .NET 二进制文件或 C# 源代码的工具,使之考虑到 static abstract
接口成员(包括 .NET 基元类型上现存的那些成员)的新概念。
受影响的 API
无