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

6.4.4Определенные пользователем неявные преобразования

Неявное пользовательское преобразование из типа S к типу T выполняется в следующем порядке:

  • Определение типов S0 и T0. Если типы S или T являются обнуляемыми, типы S0 и T0 являются базовыми для них (в противном случае S0 и T0 считаются равными S и T соответственно).

  • Поиск набора типов (D), на основании которого будут рассматриваться пользовательские операторы преобразования. Этот набор включает в себя тип S0 (если S0 является классом или структурой), базовые классы для S0 (если S0 является классом) и тип T0 (если T0 является классом или структурой).

  • Поиск набора применимых пользовательских операторов и операторов преобразования с нулификацией (U). Этот набор включает в себя пользовательские операторы и операторы неявного преобразования с нулификацией, объявленные в классах и структурах набора D и осуществляющие преобразование из типа, включающего S, к типу, включаемому типом T. Если набор U пуст, преобразование считается неопределенным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего исходного типа (SX) для операторов в наборе U:

  • Если любой из операторов набора U осуществляет преобразование из S, в качестве типа SX выбирается S.

  • В противном случае в качестве типа SX выбирается включаемый тип нижнего уровня из объединенного набора исходных типов для операторов набора U. Если найдено несколько включаемых типов нижнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего конечного типа (TX) для операторов в наборе U:

  • Если любой из операторов набора U осуществляет преобразование к T, в качестве типа TX выбирается T.

  • В противном случае в качестве типа TX выбирается включающий тип верхнего уровня из объединенного набора конечных типов для операторов набора U. Если найдено несколько включающих типов верхнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего оператора преобразования:

  • Если набор U содержит только один пользовательский оператор преобразования из типа SX к TX, он является наиболее подходящим оператором преобразования.

  • В противном случае, если набор U содержит только один оператор преобразования с нулификацией из типа SX к TX, он является наиболее подходящим оператором преобразования.

  • В противном случае преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Применение преобразования:

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

  • Для преобразования из SX к TX вызывается наиболее подходящий оператор преобразования.

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

6.4.5Определенные пользователем явные преобразования

Явное пользовательское преобразование из типа S к типу T выполняется в следующем порядке:

  • Определение типов S0 и T0. Если типы S или T являются обнуляемыми, типы S0 и T0 являются базовыми для них (в противном случае S0 и T0 считаются равными S и T соответственно).

  • Поиск набора типов (D), на основании которого будут рассматриваться пользовательские операторы преобразования. Этот набор включает в себя тип S0 (если S0 является классом или структурой), базовые классы для S0 (если S0 является классом), тип T0 (если T0 является классом или структурой) и базовые классы для T0 (если T0 является классом).

  • Поиск набора применимых пользовательских операторов и операторов преобразования с нулификацией (U). Этот набор включает в себя пользовательские операторы и операторы явного преобразования с нулификацией, объявленные в классах и структурах набора D и осуществляющие преобразование из типа, включающего S или включаемого им, к типу, включаемому типом T или включающему его. Если набор U пуст, преобразование считается неопределенным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего исходного типа (SX) для операторов в наборе U:

  • Если любой из операторов набора U осуществляет преобразование из S, в качестве типа SX выбирается S.

  • В противном случае, если любой из операторов набора U осуществляет преобразование из типа, который включает тип S, то тип SX является включаемым типом нижнего уровня в объединенном наборе исходных типов для этих операторов. Если не найден включаемый тип нижнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • В противном случае в качестве типа SX выбирается включающий тип верхнего уровня из объединенного набора исходных типов для операторов набора U. Если найдено несколько включающих типов верхнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего конечного типа (TX) для операторов в наборе U:

  • Если любой из операторов набора U осуществляет преобразование к T, в качестве типа TX выбирается T.

  • В противном случае, если любой из операторов набора U осуществляет преобразование к типу, который включается типом T, то тип TX является включающим типом верхнего уровня в объединенном наборе конечных типов для этих операторов. Если найдено несколько включающих типов верхнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • В противном случае в качестве типа TX выбирается включаемый тип нижнего уровня из объединенного набора конечных типов для операторов набора U. Если не найден включаемый тип нижнего уровня, преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Поиск наиболее подходящего оператора преобразования:

  • Если набор U содержит только один пользовательский оператор преобразования из типа SX к TX, он является наиболее подходящим оператором преобразования.

  • В противном случае, если набор U содержит только один оператор преобразования с нулификацией из типа SX к TX, он является наиболее подходящим оператором преобразования.

  • В противном случае преобразование считается неоднозначным и порождает ошибку времени компиляции.

  • Применение преобразования:

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

  • Для преобразования из SX к TX вызывается наиболее подходящий пользовательский оператор преобразования.

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

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