Это вызывает исключение, которое говорит, что источник не может быть приведен к месту назначения:
int a = 1; object b = (object)a; float c = (float)b; // Exception here
Почему?
Вы можете приводить только в штучной упаковке структуры к точному типу, поэтому вам нужно сначала привести к int:
float c = (float)(int)b;
Однако, поскольку существует неявное преобразование с плавающей точкой из int, вы можете просто:
float c = (int)b;
Этот вопрос очень часто задают на SO. Подробности смотрите в моей статье на эту тему.
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx
Вы не можете распаковать (привести к объекту и обратно) значение из одного типа данных в другой. Вам нужно будет сначала вернуть его к исходному типу, а затем вытащить. Кроме того, вы можете использовать методы Convert.To*, например,
Convert.To*
Object a = 6; Double b = Convert.ToDouble(a);
Продолжение: http://www.ideone.com/hgeob
Насколько я знаю, это потому, что вы помечаете "a" как int, а после этого вы распаковываете его как float, и это не сработает ...
, чтобы получить все правильно, вы должны сделать float c =(float) (int) b;
Проблема в том, что один и тот же синтаксис используется повторно для 3 операций (историческая проблема из C):
int a = 1; // Ok object b = (object)a; // Ok. int is struct so we may box it into object float c = (float)a; // Ok. Conversion from integer to float float c = (float)b; // Error. object b is not boxed float
Кастинг имеет разные значения.В данном случае это означает «unbox» вместо «выполнить преобразование чисел».
Обратите внимание на 6 значений здесь:
http://www.interact -sw.coик / iangblog / 2004/01/20 / литье