object obj = GetNextObjectFromInput();Преобразования
string text = (string)obj;
Exception exception = (Exception)obj;
Поэтому, отбрасывая некоторые незначительные нюансы реализации типа
Convert
или интерфейса IConvertible
, в случае приведения типа в C# вы говорите компилятору:«Доверься мне, этот тип можно привести к этому типу. Даже если ты этого не знаешь сейчас, позволь мне это сделать и всё получится.»
или
«Не беспокойся, мне неважно, если что-то потеряется при приведении.»
Для любого другого приведения, когда требуется более явная операция, требуется преобразование значения. Например, для приведения из
string
в double
может потребоваться парсинг. Преобразование в строку, например, всегда возможно, (через метод ToString()
), хотя может означать что-то другое, нежели то, что вы ожидаете.Такие преобразования могут выполняться изнутри объекта, используя методы преобразования, либо с помощью более сложных механизмов (
TypeConverter
). Вы не знаете, что может случиться во время преобразования, поэтому, по моему мнению, когда более строгое преобразование доступно, вы должны его использовать.Подводя итог, когда можно использовать явное приведение типов:
1. Приведение между базовыми типами.
2. Приведение от объекта в другой тип (может включать распаковку).
3. Приведение от производного в базовый класс (или в реализованный интерфейс).
4. Преобразование из одного типа к другому через специальные операторы преобразования.
Только первый из этих вариантов может быть реализован через тип
Convert
. Для остальных случаев у вас нет другого выбора, кроме явного приведения типа.Когда можно использовать тип
Convert
:1. Преобразование из одного базового типа в другой (с некоторыми ограничениями).
2. Преобразование из типа, реализующего интерфейс
IConvertible
в любой другой (поддерживаемый) тип.3. Преобразования массива битов в строку и наоборот.
Заключение
По моему мнению,
Convert
должен использоваться во всех случаях, когда вы знаете, что преобразование может завершиться неудачей, даже если оно может быть выполнено с помощью приведения типов. Это даёт понять читающим ваш код ваши намерения и что вы знаете, что преобразование может завершиться неудачей. Для остальных случаев используйте приведение типа, т.к. нет выбора. Но если доступен другой метод (Parse
, TryParse
), я советую его использовать. Кроме того, имейте в виду, что приведение типов и
Convert
иногда приводят к разным результатам. Например: double real = 1.6;Приведение типа (ожидаемо) отсекает дробную часть, а Convert осуществляет округление до ближайшего целого (а это может стать неожиданностью). Каждое преобразование может отличаться от приведения типа, поэтому единого правила для всех случаев нет. Лучше для каждого случая проконсультироваться с MSDN.
int castedInteger = (int)real; // 1
int convertedInteger = Convert.ToInt32(real); // 2
Источник: https://stackoverflow.com/questions/15394032/difference-between-casting-and-using-the-convert-to-method