Язык программирования C#9 и платформа .NET5
<b>// Этот код не скомпилируете»!</b>.namespace MyNamespace{.class public MyBaseClass {}.class public MyDerivedClass<b> extends MyBaseClass {}</b>}Чтобы корректно определить родительский класс для
, потребуется указать полностью заданное имяMyDerivedClass:MyBaseClass<b>// Уже лучше!</b>.namespace MyNamespace{.class public MyBaseClass {}.class public MyDerivedClass<b> extends MyNamespace.MyBaseClass {}</b>}В дополнение к атрибутам
иpublicопределение класса CIL может иметь множество добавочных квалификаторов, которые управляют видимостью типа, компоновкой полей и т.д. В табл. 19.2 описаны избранные атрибуты, которые могут применяться в сочетании с директивойextends..classОпределение и реализация интерфейсов в CIL
Несколько странно, но типы интерфейсов в CIL определяются с применением директивы
. Тем не менее, когда директива.classдекорирована атрибутом interface, тип трактуется как интерфейсный тип CTS. После определения интерфейс можно привязывать к типу класса или структуры с использованием атрибута.class:implements.namespace MyNamespace{<b> // Определение интерфейса.</b>.class public interface IMyInterface {}// Простой базовый класс..class public MyBaseClass {}<b> // Теперь MyDerivedClass реализует IMylnterface</b><b> // и расширяет MyBaseClass.</b>.class public MyDerivedClassextends MyNamespace.MyBaseClassimplements MyNamespace.IMyInterface {}}На заметку! Конструкция
должна предшествовать конструкцииextends. Кроме того, в конструкцииimplementsможет содержаться список интерфейсов с разделителями-запятымиimplementsВспомните из главы 8, что интерфейсы могут выступать в роли базовых для других типов интерфейсов, позволяя строить иерархии интерфейсов. Однако вопреки возможным ожиданиям применять атрибут
для порождения интерфейсаextendsот интерфейсаАв CIL нельзя. АтрибутВиспользуется только для указания базового класса типа. Когда интерфейс необходимо расширить, снова будет применяться атрибутextends, например:implements<b>// Расширение интерфейсов в CIL.</b>.class public interface IMyInterface {}.class public interface IMyOtherInterfaceimplements MyNamespace.IMyInterface {}Определение структур в CIL
Директива
может использоваться для определения любой структуры CTS, если тип расширяет.class. Кроме того, такая директиваSystem.ValueTypeдолжна уточняться атрибутом.class(учитывая, что структуры никогда не могут выступать в роли базовых для других типов значений). Если попытаться поступить иначе, тогда компиляторsealedвыдаст сообщение об ошибке.ilasm.exe<b>// Определение структуры всегда является запечатанным.</b>.class public sealed MyStructextends [System.Runtime]System.ValueType{}Имейте в виду, что в CIL предусмотрен сокращенный синтаксис для определения типа структуры. В случае применения атрибута
новый тип автоматически становится производным отvalue. Следовательно, тип[System.Runtime]System.ValueTypeможно было бы определить и так:MyStruct<b>// Сокращенный синтаксис объявления структуры.</b>.class public sealed value MyStruct{}Определение перечислений в CIL
Перечисления .NET Core порождены от класса
, который являетсяSystem.Enum(и потому также должен быть запечатанным). Чтобы определить перечисление в CIL, необходимо просто расширитьSystem.ValueType:[System.Runtime]System.Enum<b>// Перечисление.</b>.class public sealed MyEnumextends [System.Runtime]System.Enum{}Подобно структурам перечисления могут быть определены с помощью сокращенного синтаксиса, используя атрибут
:enum<b>// Сокращенный синтаксис определения перечисления.</b>.class public sealed enum MyEnum{}Вскоре вы увидите, как указывать пары "имя-значение" перечисления.
Определение обобщений в CIL
Обобщенные типы также имеют собственное представление в синтаксисе CIL. Вспомните из главы 10, что обобщенный тип или член может иметь один и более параметров типа. Например, в типе
определен один параметр типа, а вList<T>— два. В CIL количество параметров типа указывается с применением символа обратной одиночной кавычки (Dictionary<TKey,TValue>), за которым следует число, представляющее количество параметров типа. Как и в С#, действительные значения параметров типа заключаются в угловые скобки.'
