C # приведение int к исключению бросания float (во время выполнения) - PullRequest
1 голос
/ 12 апреля 2011

Это вызывает исключение, которое говорит, что источник не может быть приведен к месту назначения:

int a = 1;
object b = (object)a;
float c = (float)b; // Exception here

Почему?

Ответы [ 6 ]

5 голосов
/ 12 апреля 2011

Вы можете приводить только в штучной упаковке структуры к точному типу, поэтому вам нужно сначала привести к int:

float c = (float)(int)b;

Однако, поскольку существует неявное преобразование с плавающей точкой из int, вы можете просто:

float c = (int)b;
3 голосов
/ 12 апреля 2011

Этот вопрос очень часто задают на SO. Подробности смотрите в моей статье на эту тему.

http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx

1 голос
/ 12 апреля 2011

Вы не можете распаковать (привести к объекту и обратно) значение из одного типа данных в другой. Вам нужно будет сначала вернуть его к исходному типу, а затем вытащить. Кроме того, вы можете использовать методы Convert.To*, например,

Object a = 6;
Double b = Convert.ToDouble(a);

Продолжение: http://www.ideone.com/hgeob

1 голос
/ 12 апреля 2011

Насколько я знаю, это потому, что вы помечаете "a" как int, а после этого вы распаковываете его как float, и это не сработает ...

, чтобы получить все правильно, вы должны сделать float c =(float) (int) b;

0 голосов
/ 12 апреля 2011

Проблема в том, что один и тот же синтаксис используется повторно для 3 операций (историческая проблема из C):

  1. Бокс / распаковка значения
  2. Преобразование чисел
  3. литье

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
0 голосов
/ 12 апреля 2011

Кастинг имеет разные значения.В данном случае это означает «unbox» вместо «выполнить преобразование чисел».

Обратите внимание на 6 значений здесь:

http://www.interact -sw.coик / iangblog / 2004/01/20 / литье

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...