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