Статические абстрактные члены, объявленные в интерфейсах
.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
Н/П