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

6.2.8Пользовательские явные преобразования

Пользовательское явное преобразование включает в себя необязательное стандартное явное преобразование, за которым следует выполнение пользовательского оператора явного преобразования, а затем другое необязательное стандартное явное преобразование. Точные правила вычисления пользовательских явных преобразований описываются в §6.4.5.

6.3Стандартные преобразования

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

6.3.1Стандартные неявные преобразования

К стандартным неявным преобразованиям относятся следующие преобразования:

  • Преобразования идентификатора (§6.1.1).

  • Неявные преобразования числовых типов (§6.1.2).

  • Неявные преобразования обнуляемых типов (§6.1.4).

  • Неявные преобразования ссылочных типов (§6.1.6)).

  • Преобразования упаковки (§6.1.7).

  • Неявные преобразования выражений констант (§6.1.8).

  • Неявные преобразования, включающие параметры типа (§6.1.10).

К стандартными неявным преобразованиям не относятся пользовательские неявные преобразования.

6.3.2Стандартные явные преобразования

К стандартным явным преобразованиям относятся все стандартные неявные преобразования, а также подмножество явных преобразований, для которых существуют обратные стандартные неявные преобразования. Другими словами, если существует стандартное неявное преобразование из типа A к типу B, также существует стандартное явное преобразование из типа A к B и из типа B к A.

6.4Пользовательские преобразования

В C# можно дополнить предопределенные явные и неявные преобразования пользовательскими преобразованиями. Пользовательские преобразования определяются посредством объявления операторов преобразования (§10.10.3) в типах класса и структуры.

6.4.1Допустимые пользовательские преобразования

В C# допускается объявление лишь некоторых пользовательских преобразований. В частности, не допускается переопределение уже существующего явного или неявного преобразования.

Предположим, что для заданных исходного типа S и конечного T (если S или T являются обнуляемыми типами) типы S0 и T0 являются соответствующими базовыми типами (в противном случае S0 и T0 считаются равными S и T соответственно). В классе или структуре разрешено объявлять преобразование от исходного типа S к конечному типу T, если только справедливо все следующее:

  • S0 и T0 являются разными типами;

  • либо S0, либо T0 является типом структуры или класса, где имеет место объявление этого оператора;

  • ни S0, ни T0 не является типом_интерфейса;

  • без преобразований, определенных пользователем, не существует преобразование от S к T или от T к S.

Дополнительные сведения об ограничениях, накладываемых на пользовательские преобразования, см. в §10.10.3.

6.4.2Операторы преобразования с нулификацией

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

Оператор преобразования с нулификацией классифицируется точно так же (явным или неявным), как и соответствующий ему базовый пользовательский оператор преобразования. Термин «пользовательское преобразование» применяется как к пользовательским операторам преобразования, так и к операторам с нулификацией.

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