2014-02-14 4 views
0

я унаследовал следующую структуру инициализации, где мой параметр представляет собой double номер:Кастинг объект в два раза

public void Init(IDictionary<string, object> dict) 
{ 
    double val = (double)dict[MY_KEY]; 
} 

Это прекрасно работает, если объект был действительно double, например,

dict[MY_KEY] = 1.0; 

но ломается, когда объект является другим цифровым типом, например. int, как показано ниже:

dict[MY_KEY] = 1; 

Как я могу изменить свой метод так, что он работает со всеми числовыми типами, которые могут быть неявно преобразованы в double?

+1

Если это возможно, я настоятельно рекомендую вам не ставить себя в такое положение для начала. Если вам нужно двойное, заставляйте людей вводить двойное число, а не принимать любой возможный тип числа и пытаться превратить его в двойное. В противном случае вы настроитесь на мир. Имейте в виду, что все числовые типы имеют различный набор чисел, которые они могут представлять. Кто-то может ввести число, которое, чтобы быть преобразованным в двойное, требует потери информации, чего они не ожидают. Ответы ниже кажутся волшебной пулей, но они просто нет. – Servy

ответ

5
double val = Convert.ToDouble(dict[MY_KEY]); 

До тех пор, пока dict [MY_KEY] не является нулевым, если это произойдет, это вызовет исключение.

7

Используйте метод Convert.ToDouble(object), вместо того чтобы явно его лить.

public void Init(IDictionary<string, object> dict) 
{ 
    double val = Convert.ToDouble(dict[MY_KEY]); 
} 
0

Другой вариант - использовать метод TryParse(). Это было бы лучшим вариантом для использования здесь, поскольку метод является общедоступным, и вы пытаетесь преобразовать объект в double, который будет генерировать исключение, если нормальное явное или неявное преобразование завершится с ошибкой.

public void Init(IDictionary<string, object> dict) 
{ 
    double val; 

    if (!double.TryParse(dict[MY_KEY].ToString(), out val)) 
    { 
     // Handle parse failure if necessary. 
     // On failure, the return value of val will be 0 
    } 
} 

Вот документации MSDN, если заинтересованы в более некоторые особенности: http://msdn.microsoft.com/en-us/library/994c0zb1%28v=vs.100%29.aspx

Конечно, изменение типа двойной вместо объекта в параметре, как Servy упоминалось бы лучший вариант, если это возможно, так что нет преобразование должно быть выполнено.

Смежные вопросы