Разработка компиляторов

       

Явные и неявные преобразования


  • Приведения бывают явными и неявными
  • Классы и структуры могут задавать применимые к ним явные и неявные приведения:

public struct Rational { public static implicit operator Rational(int i) { return new Rational(i,1); } public static explicit operator double (Rational r) { return (double) r.Numerator / r.Denominator }

Во всех языках допустимы присваивания, в которых участвуют переменные похожих, но все-таки различных типов. Например в C# допустимы следующие операторы:

short v1 = 44; int v2 = v1;

Здесь во время второго присваивания выполняется неявное приведение переменной v1 к типу int . Однако неявные приведения возможны только при присваиваниях, в которых не может произойти потери данных, т.е. конечный тип должен содержать в себе все значения исходного типа1). Обратное преобразование должно сопровождаться явным приведением :

v1 = (short) v2;

Применим эту идею для организации сокращенной записи преобразований. Предположим, что у нас есть класс Rational , реализующий рациональные числа. Опишем набор приведений для этого класса (обратите внимание, что Rational является структурой, а не классом - структуры предоставляют практически все те же языковые возможности, что и классы):

public struct Rational { public int Numerator, Denominator; ... public static implicit operator Rational(int i) { return new Rational(i,1); } public static explicit operator double (Rational r) { return (double) r.Numerator / r.Denominator } }

Rational r = 4; // implicit conversion Rational r = new Rational(2,3); double d = (double)r; // error without explicit conversion



Содержание раздела