С# Кастинг с десятичной запятой

Что, если таковые имеются, есть разница между?

decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);

Ответ 1

Нет никакой разницы. Если вы посмотрите на источник:

В десятичной системе:

public static explicit operator decimal(double value)
{
    return new decimal(value);
}    

В Конвертировать:

public static decimal ToDecimal(float value)
{
    return (decimal) value;
}

Итак, в конце концов все они звонят new decimal(double).

Ответ 2

Все они добиваются одинаковых результатов. Однако здесь объясняется более сложное объяснение:

  • Метод 1 создает новую переменную, которая явно вводит myDouble для ввода decimal. Когда вы произносите, вы говорите: "Этот объект типа A на самом деле является объектом типа B-производным от-A или существует оператор литья, чтобы отличать A от B".

  • Метод 2 создает новую переменную, которая преобразует myDouble в соответствующий тип (decimal) через перегрузку конструктора. Когда вы вызываете конструктор, вы говорите: "Создайте новый объект на основе аргументов, переданных в конструктор".

  • Метод 3 преобразует базовый тип данных (double) в другой базовый тип данных (decimal). Когда вы используете что-то вроде Convert.ToDecimal(), вы говорите: "Этот объект не относится к типу B, но существует способ превратить его в объект типа B".

Относительно Convert MSDN заявляет:

  • Существует метод преобразования для преобразования каждого базового типа в любой другой базовый тип. Однако фактическая операция преобразования относится к трем категориям:

  • Преобразование из типа в себя просто возвращает этот тип. Фактически не выполняется преобразование.

  • Преобразование, которое не может дать значимого результата, вызывает InvalidCastException. На самом деле преобразование не выполняется. Исключение выбрано для преобразований из Char в Boolean, Single, Double, Decimal или DateTime, а из этих типов - в Char. Исключение выбрано для конверсий из DateTime для любого типа, кроме String, и любого типа, кроме String, в DateTime. Любой базовый тип, отличный от описанного выше, может быть преобразован в любой другой базовый тип и из любого другого.

Ответ 3

Нет никакой разницы, фактически, с функциональной точки зрения. Это разные способы достижения такого же результата.

Важно, чтобы в случае Convert.ToDecimal у вас есть возможность указать формат IFormatProvider (культура), чтобы вы получили больше гибкость.

Если вы не заботитесь о мультикультурной среде, выберите любой из них, который вам нравится.