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

6.4.3Вычисление пользовательских преобразований

Пользовательское преобразование предназначено для преобразования значения из собственного исходного типа к другому, конечному типу. Вычисление пользовательского преобразования основывается на поиске пользовательского оператора преобразования, наиболее подходящего для заданных исходного и конечного типов. Поиск оператора осуществляется в несколько этапов:

  • Поиск набора классов и структур, на основании которых будут рассматриваться пользовательские операторы преобразования. Этот набор включает в себя исходный и конечный типы, а также их базовые классы (при этом явно подразумевается, что пользовательские операторы могут быть объявлены только в классах и структурах, и типы, отличные от типов класса, не могут иметь базовых классов). На этом этапе, если исходный или конечный тип является обнуляемым_типом, вместо него используется базовый тип.

  • На основании этого набора типов определяется, какие пользовательские операторы и операторы преобразования с нулификацией могут быть применены. Оператор преобразования применим только в том случае, если можно выполнить стандартное преобразование (§6.3) из исходного типа к типу операнда оператора, а также стандартное преобразование из типа результата оператора к конечному типу.

  • На основании набора применимых пользовательских операторов определяется, какой из операторов является однозначно наиболее подходящим. В общих чертах, наиболее подходящим оператором является тот, для которого тип операнда наиболее «близок» к исходному типу, а тип результата — к конечному типу. Пользовательские операторы преобразования являются более предпочтительными по сравнению с операторами преобразования с нулификацией. Точные правила определения наиболее подходящего пользовательского оператора преобразования описываются в последующих разделах.

После определения наиболее подходящего пользовательского оператора преобразования осуществляется фактическое выполнение пользовательского преобразования, включающее в себя три этапа:

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

  • Затем вызывается пользовательский оператор преобразования или оператор с нулификацией и выполняется преобразование.

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

При вычислении пользовательского преобразования никогда не используется более одного пользовательского оператора или оператора с нулификацией. Другими словами, при преобразовании из типа S к типу T никогда не выполняется промежуточное преобразование из типа S к X с последующим преобразованием из X к T.

Точные определения вычисления явных и неявных пользовательских преобразований приведены в последующих разделах. В определениях используются следующие термины:

  • Если существует стандартное неявное преобразование (§6.3.1) из типа A к типу B, и при этом типы A и B не являются типами_интерфейса, полагается, что тип A включен в тип B, а тип B включает тип A.

  • Наиболее охватывающий тип в наборе типов — это один тип, который охватывает все остальные типы в наборе. Если ни один тип не включает все остальные типы, включающий тип верхнего уровня в наборе отсутствует. Другими словами, включающий тип верхнего уровня — это «самый широкий» тип в наборе или тип, в который может быть неявно преобразован любой другой тип набора.

  • Включаемым типом нижнего уровня в наборе типов является тип, который включается всеми остальными типами набора. Если ни один тип не включается всеми остальными типами, включаемый тип нижнего уровня в наборе отсутствует. Другими словами, включаемый тип нижнего уровня — это «самый узкий» тип в наборе или тип, который может быть неявно преобразован в любой другой тип набора.

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