Лучшее объяснение, которое я видел, можно увидеть ниже, а затем ссылку на источник:
"... Правда немного сложнее, чем .NET предоставляет
три способа добраться из точки А в точку Б.
Во-первых, есть неявное приведение. Это актерский состав, который не
потребовать от вас выполнения чего-то большего, чем задание:
int i = 5;
double d = i;
Их также называют "расширяющимися конверсиями", и .NET позволяет вам
выполнять их без оператора приведения, потому что вы никогда не могли потерять
информация, делающая это: возможный диапазон допустимых значений двойного
охватывает диапазон допустимых значений для int, а затем некоторые, так
вы никогда не будете выполнять это задание, а затем открыть для себя
Ужас, что время выполнения упало на несколько цифр от значения int. За
ссылочные типы, правило неявного приведения заключается в том, что
никогда не мог выдать InvalidCastException: это ясно для компилятора
что актерский состав всегда действителен.
Вы можете создавать новые неявные операторы приведения для ваших собственных типов (которые
означает, что вы можете делать неявные приведения, которые нарушают все правила, если
ты глуп по этому поводу). Основное правило заключается в том, что неявное
актерский состав никогда не может включать в себя возможность потери информации в
Переход.
Обратите внимание, что базовое представление изменилось в этом
преобразование: double представляется совершенно иначе, чем int.
Второй вид преобразования - явное приведение. Явное приведение
требуется там, где есть вероятность потери информации, или
существует вероятность того, что приведение может быть недействительным и, следовательно,
InvalidCastException:
double d = 1.5;
int i = (int)d;
Здесь вы явно потеряете информацию: я буду 1 после
приведение, так что 0,5 теряется. Это также известно как «сужение»
преобразование, и компилятор требует, чтобы вы включили явное приведение
(int), чтобы указать, что да, вы знаете, что информация может быть потеряна, но
тебе все равно.
Аналогично, для ссылочных типов компилятор требует явного приведения в
ситуации, в которых приведение может быть недействительным во время выполнения, как сигнал
что да, вы знаете, что есть риск, но вы знаете, что делаете.
Третий вид обращения - это такой радикальный переход
в представлении, что дизайнеры не предоставили даже явного
приведение: они заставляют вас вызывать метод для преобразования:
string s = "15";
int i = Convert.ToInt32(s);
Обратите внимание, что здесь нет ничего, что абсолютно требовало бы вызова метода.
Неявные и явные приведения также являются вызовами методов (это то, как вы делаете
твой собственный). Дизайнеры вполне могли бы создать явный
оператор приведения, который преобразовал строку в int. Требование, чтобы
Вы называете метод стилистический выбор, а не фундаментальный
требование языка.
Стилистическое мышление выглядит примерно так: String-to-int - это
сложное преобразование с большим количеством возможностей для вещей, идущих
ужасно неправильно:
string s = "The quick brown fox";
int i = Convert.ToInt32(s);
Таким образом, вызов метода дает вам документацию для чтения и широкий
намек на то, что это нечто большее, чем просто быстрый бросок.
При проектировании ваших собственных типов (особенно ваших собственных типов значений), вы
может решить создать операторы приведения и функции преобразования. Линии
деление «неявное приведение», «явное приведение» и «функция преобразования»
территория немного размыта, поэтому разные люди могут делать разные
решения относительно того, что должно быть чем. Просто попробуйте помнить
потеря информации и возможность исключений и неверных данных, а также
это должно помочь вам решить. "
- Брюс Вуд, 16 ноября 2005 г.
http://bytes.com/forum/post1068532-4.html