Каков наилучший подход к решению исключения c # unboxing при приведении объекта к valuetype?
Вопрос
Я только что преобразовал фрагмент кода из VB.NET в C # и наткнулся на эту проблему.
Рассмотрим этот код:
Dim x As Integer = 5
Dim y As Object = x
Dim z As Decimal = CType(y, Decimal)
Нет ошибки ни от компилятора, ни во время выполнения.z - это пять.
Теперь давайте переведем этот код на C#
int x = 5;
object y = x;
decimal z = (decimal)y;
Ошибки компилятора нет, но во время выполнения генерируется исключение:
Cannot unbox "y" to "decimal"
Теперь мой вопрос в том, какой был бы самый умный способ C # сделать это.
В настоящее время мой код выглядит следующим образом.
int x = 5;
object y = x;
decimal z = decimal.Parse(y.ToString());
Но другим решением было бы:
decimal z = (decimal)(int)y;
Что выглядит немного запутанно, но, вероятно, имеет меньше накладных расходов, чем decimal.Parse, я думаю.
Решение
(decimal)(int)x
это правильный способ сделать это, если вы ожидаете, что объект в штучной упаковке будет целым числом.Преобразование в строку и синтаксический анализ не являются хорошим способом решения проблемы и сопряжены с некоторыми накладными расходами.
Если вы просто знаете, что объект может быть преобразован в decimal
в некотором роде, попробуйте System.Convert.ToDecimal
способ.Он справится с этим за тебя.
Другие советы
Как насчет:
z = Convert.ToDecimal(y);
Преобразовать.Десятичный (y);
Если вы хотите быть в полной безопасности, вы могли бы попробовать:
int x = 5;
object y = x;
decimal z;
if (Decimal.TryParse(y.ToString(), out z))
{
// z is a decimal
}
else
{
// z is not a decimal
}
Таким образом, если кто-то установит y равным = "donkey", вы сможете обработать это, не создавая исключения.Конечно, вы можете предпочесть выдать исключение, если z не может быть преобразован.Просто еще один вариант...