接口中声明的静态抽象成员
.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
不可用