接口中声明的静态抽象成员

.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

不可用

请参阅