Посібник C#, Оператори перетворення

Іноді об'єкт певного класу потрібно використовувати у виразі, що включає дані інших типів. В одних випадках для цієї мети виявляється придатним перевантаження одного або більше операторів, а в інших випадках - звичайне перетворення типу класу на цільовий тип. Для подібних ситуацій в C# передбачена спеціальна різновид операторного методу, званаоператором перетворення. Такий оператор перетворює об'єкт вихідного класу на інший тип. Оператори перетворення допомагають повністю інтегрувати типи класів серед програмування на C#, дозволяючи вільно користуватися класами разом з іншими типами даних, за умови, що визначено порядок перетворення на ці типи.

Існують дві форми операторів перетворення: явна та неявна. Нижче вони представлені у загальному вигляді:

де цільовий_тип позначає той тип, який виконується перетворення; вихідний_тип - той тип, який перетворюється; значення - конкретне значення, що набуває класом після перетворення. Оператори перетворення повертають дані, що мають цільовий_тип, причому вказувати інші типи даних, що повертаються, не дозволяється.

Якщо оператор перетворення вказаний у неявній формі (implicit ), то перетворення викликається автоматично, наприклад, у тому випадку, коли об'єкт використовується у виразі разом із значенням цільового типу. Якщо оператор перетворення вказаний у явній формі (explicit ), то перетворення викликається в тому випадку, коли виконується приведення типів. Для тих самих вихідних і цільових типів даних не можна вказувати оператор перетворення одночасно у явній і неявної формі.

Оператор неявного перетворення застосовується автоматично у таких випадках: коли у виразіпотрібне перетворення типів; методом передається об'єкт; здійснюється привласнення та проводиться явне приведення до цільового типу. З іншого боку, можна створити оператор явного перетворення, що викликається лише тоді, коли відбувається явне приведення типів. У такому випадку оператор явного перетворення не викликається автоматично, як показано на прикладі.

На оператори перетворення накладається низка таких обмежень:

Вихідний або цільовий тип перетворення повинен відноситися до класу, для якого оголошено це перетворення. Зокрема, не можна перевизначити перетворення на тип int, якщо воно спочатку вказано як перетворення на тип double.

Не можна вказувати перетворення на клас object або з цього класу.

Для тих самих вихідних і цільових типів даних не можна вказувати одночасно явне і неявне перетворення.

Не можна вказувати перетворення базового класу на похідний клас.

Не можна вказувати перетворення в інтерфейс або з нього.

Крім зазначених вище обмежень, є низка рекомендацій, якими зазвичай керуються під час виборів операторів явного чи неявного перетворення. Незважаючи на всі переваги неявних перетворень, до них слід вдаватися лише в тих випадках, коли перетворення не властиві помилки. Щоб уникнути подібних помилок, неявні перетворення повинні бути організовані тільки в тому випадку, якщо задовольняються такі умови. По-перше, інформація не втрачається, наприклад, внаслідок усічення, переповнення чи втрати знака. І по-друге, перетворення не призводить до виняткової ситуації. Якщо ж неявне перетворення не задовольняє цим двом умовам, слід вибрати явне перетворення.