Каков наилучший подход к решению исключения c # unboxing при приведении объекта к valuetype?

StackOverflow https://stackoverflow.com/questions/1153612

  •  18-09-2019
  •  | 
  •  

Вопрос

Я только что преобразовал фрагмент кода из 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 не может быть преобразован.Просто еще один вариант...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top