Поделиться через


Статические абстрактные члены, объявленные в интерфейсах

.NET 6 предварительно просматривает новую функцию, в которой static члены интерфейса могут быть помечены как abstract.NET. Эта функция включает несколько изменений в спецификации ECMA 335, разрешающих использование шаблонов метаданных промежуточного языка, которые ранее считались недопустимыми. Дополнительные сведения в описании проблемы: dotnet/runtime#49558.

Старое поведение

Если статический интерфейс был помечен как abstract

  • Компилятор C# создал ошибку CS0112.
  • Средства и другие компиляторы создали недопустимые метаданные промежуточного языка.

Новое поведение

Начиная с версии .NET 6, члены статических интерфейсов могут помечаться как abstract и будут успешно компилироваться. Кроме того, созданные шаблоны метаданных промежуточного языка теперь считаются допустимыми из-за изменений в спецификации ECMA 335.

Реализация членов интерфейса static abstract предоставляется типами, реализующими интерфейс.

Примечание.

В .NET 6 необходимо включить функции предварительной версии в проекте, чтобы иметь возможность пометить член интерфейса как static abstract.

Поскольку это новый допустимый шаблон промежуточного языка, существующие средства могут неправильно обрабатывать связанные метаданные и демонстрировать непредвиденное поведение. Вполне вероятно, что в инструментарии появится новый шаблон метаданных, поскольку интерфейсы с членами static abstract теперь отображаются в примитивных типах, таких как System.Int32.

Представленные версии

.NET 6

Тип критического изменения

Это изменение может повлиять на совместимость двоичного кода.

Причина изменения

Это изменение было внесено из-за отсутствия способа абстракции статических членов и записи обобщенного кода, который применяется к различным типам, определяющим эти статические члены. Это было особенно проблематично для типов членов, которые существуют только в статической форме, например в форме операторов.

Обновите весь инструментарий, использующий двоичные файлы .NET или исходный код C# с учетом новой концепции членов интерфейса static abstract, включая члены, которые теперь существуют в примитивных типах .NET.

Затронутые API

Н/П

См. также