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


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

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

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

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

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

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

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

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

Замечание

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

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

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

.NET 6

Тип разрушающего изменения

Это изменение может повлиять на совместимость двоичных файлов.

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

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

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

Затронутые API

Не применимо

См. также