Вы можете объявить операторы преобразования в своем классе с помощью ключевых слов explicit
или implicit
.
Как правило, вы должны предоставлять implicit
операторы преобразования только в том случае, если преобразование невозможно. Используйте explicit
операторы преобразования, если преобразование может завершиться ошибкой.
public class MyClass
{
private byte[] _bytes;
// change explicit to implicit depending on what you need
public static explicit operator MyClass(byte[] b)
{
MyClass m = new MyClass();
m._bytes = b;
return m;
}
// change explicit to implicit depending on what you need
public static explicit operator byte[](MyClass m)
{
return m._bytes;
}
}
Использование explicit
означает, что пользователям вашего класса нужно будет выполнить явное преобразование:
byte[] foo = new byte[] { 1, 2, 3, 4, 5 };
// explicitly convert foo into an instance of MyClass...
MyClass bar = (MyClass)foo;
// explicitly convert bar into a new byte[] array...
byte[] baz = (byte[])bar;
Использование implicit
означает, что пользователям вашего класса не нужно выполнять явное преобразование, все происходит прозрачно:
byte[] foo = new byte[] { 1, 2, 3, 4, 5 };
// imlpicitly convert foo into an instance of MyClass...
MyClass bar = foo;
// implicitly convert bar into a new byte[] array...
byte[] baz = bar;
Для поддержки кастомного приведения вам необходимо предоставить операторы приведения (явные или неявные). Следующий пример класса EncodedString представляет собой упрощенную реализацию строки с настраиваемой кодировкой (может быть полезно, если вам нужно обрабатывать огромные-огромные строки и сталкиваться с проблемами потребления памяти, потому что строки .Net являются Unicode - каждый символ занимает 2 байта памяти - и EncodedString может занимать 1 байт на символ).
EncodedString можно преобразовать в byte [] и в System.String. Комментарии в коде проливают свет, а также объясняют пример, когда неявное преобразование может быть опасным.
Обычно вам нужна очень веская причина для объявления любых операторов преобразования, потому что.
Дополнительную информацию можно найти на MSDN .
источник