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

.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

另请参阅