Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

13.1.3.1Безопасность вариативности

Появление аннотаций вариативности в списке параметров типа ограничивает количество местоположений, где могут появляться типы в рамках объявления типа.

Типо T является небезопасным при выводе, если справедливо одно из следующих условий.

  • T является контравариантным типом параметра;

  • T — это тип массива с типом элементов, небезопасным при выводе.

  • T является типом интерфейса или делегата S<A1,… AK>, сформированным из универсального типа S<X1, .. XK>, в котором по меньшей мере один Ai содержит один из следующих вариантов:

  • X является ковариантным или инвариантным, а Ai является небезопасным при выводе.

  • Xi является ковариантным или инвариантным, а Ai является безопасным при выводе.

Тип T является небезопасным при вводе, если справедливо одно из следующих условий.

  • T является параметром ковариантного типа.

  • T является типом массива с типом элементов, небезопасным при вводе.

  • T является типом интерфейса или делегата S<A1,… AK>, сформированным из универсального типа S<X1, .. XK>, в котором по меньшей мере один Ai содержит один из следующих вариантов:

  • Xi является ковариантным или инвариантным, а Ai является безопасным при вводе.

  • Xi является контравариантным или инвариантным, а Ai является безопасным при выводе.

С интуитивной точки зрения, тип, небезопасный при выводе, запрещен в позиции вывода, а тип, небезопасный при вводе, запрещен в позиции ввода.

Тип является безопасным при выводе, если он не является небезопасным при выводе, а тип, безопасный при вводе, это тип, который не является небезопасным при вводе.

13.1.3.2Вариантные преобразования

Назначение аннотаций вариативности – предоставить более мягкие преобразования (но безопасные для типа) типам интерфейса и делегатов. Определения неявных (§6.1) и явных (§6.2) преобразований используют указание возможности преобразования вариативности, которое определяется следующим образом:

Тип T<A1, …, An> является вариативно-преобразуемым в тип T<B1, …, Bn>, если T является типом интерфейса или делегата, объявленного с параметрами типа варианта T<X1, …, Xn>, и для каждого параметра типа варианта Xi имеет смысл один из следующих пунктов.

  • Xi является ковариантным, и существует неявное преобразование идентификации или ссылки из Ai в Bi.

  • Xi является контравариантным, и существует неявное преобразование идентификации или ссылки из Bi в Ai.

  • Xi является инвариантным и существует преобразование идентификации из Ai в Bi.

13.1.4Базовые интерфейсы

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

база_интерфейса:: : список_типов_интерфейсов

Для интерфейса сформированного типа явные базовые интерфейсы образуются путем замены объявлений явных базовых интерфейсов универсального типа для каждого параметра_типа в объявлении базового интерфейса соответствующими аргументами_типа сформированного типа.

Уровень доступа явных базовых интерфейсов для конкретного интерфейса должен быть не ниже уровня доступа самого интерфейса (§3.5.4). Например, указание интерфейса с уровнем доступа private или internal как базы_интерфейса для интерфейса с уровнем доступа public приведет к возникновению ошибки компилирования.

Явное или неявное наследование интерфейса из самого себя также приведет к возникновению ошибки компилирования.

Базовыми интерфейсами для интерфейса являются явные базовые интерфейсы и их базовые интерфейсы. Другими словами, набор базовых интерфейсов является полным транзитивным замыканием явных базовых интерфейсов, их явных базовых интерфейсов и так далее. Интерфейс наследует все члены своих базовых интерфейсов. В этом примере

interface IControl { void Paint(); }

interface ITextBox: IControl { void SetText(string text); }

interface IListBox: IControl { void SetItems(string[] items); }

interface IComboBox: ITextBox, IListBox {}

базовыми интерфейсами для интерфейса IComboBox являются интерфейсы IControl, ITextBox и IListBox.

Другими словами, приведенный выше интерфейс IComboBox наследует члены интерфейсов SetText и SetItems, а также члены интерфейса Paint.

Каждый базовый интерфейс любого интерфейса должен быть безопасным при выводе (§13.1.3.1). Класс или структура, которые реализуют интерфейс, также неявно реализуют все его базовые интерфейсы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]