Пользовательское преобразование типов можно реализовать с помощью операторов преобразования implicit
или explicit
.
Операторы преобразования могут быть явными или неявными.Операторы неявного преобразования проще в использовании, но явные операторы полезны, если вы хотите, чтобы пользователи оператора знали, что происходит преобразование.В этом разделе описываются оба типа.
Пример
Это пример явного оператора преобразования.Этот оператор преобразует из типа Byte в тип значения с именем Digit.Поскольку не все байты могут быть преобразованы в цифру, преобразование является явным, что означает, что необходимо использовать приведение, как показано в методе Main.
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static explicit operator Digit(byte b) // explicit byte to digit conversion operator
{
Digit d = new Digit(b); // explicit conversion
System.Console.WriteLine("Conversion occurred.");
return d;
}
}
class TestExplicitConversion
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (System.Exception e)
{
System.Console.WriteLine("{0} Exception caught.", e);
}
}
}
// Output: Conversion occurred.
В этом примере демонстрируется оператор неявного преобразования путем определенияоператор преобразования, отменяющий то, что делал предыдущий пример: он преобразует класс значения с именем Digit в целочисленный тип Byte .Поскольку любая цифра может быть преобразована в байт , нет необходимости заставлять пользователей явно указывать преобразование.
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static implicit operator byte(Digit d) // implicit digit to byte conversion operator
{
System.Console.WriteLine("conversion occurred");
return d.value; // implicit conversion
}
}
class TestImplicitConversion
{
static void Main()
{
Digit d = new Digit(3);
byte b = d; // implicit conversion -- no cast needed
}
}
// Output: Conversion occurred.
из: http://msdn.microsoft.com/en-us/library/85w54y0a(v=VS.100).aspx
Doбудьте осторожны с этим, для удобочитаемости часто бывает странно видеть, как один тип магически приводится к другому - люди не всегда сначала думают, что в игре есть операторы преобразования.