2011-04-11 2 views
1

Это бросает исключение, говорят источник не может быть отлит по назначению:C# отливка INT плавать метания исключения (во время выполнения)

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

Почему?

+3

возможно дубликат [Почему \ [(целое) (объект) 10м; \] делает исключение «Указанный приведение недействительным»?] (http://stackoverflow.com/questions/3953391/why-intobject10m-does-throw-specified-cast-is-not-valid-exception) –

ответ

5

Вы можете только бросить штучные структуры к точному типу, так что вам нужно бросить в целом первое:

float c = (float)(int)b; 

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

float c = (int)b; 
1

Насколько я знаю, это потому, что поле «а» как междунар и после этого вы распаковывать его как поплавок и это не подходит ...

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

1

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

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

Последующая деятельность: http://www.ideone.com/hgeob

0

Проблема заключается в том, что тот же синтаксис используется повторно для 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

UL/OLs смешно с парсером, вам нужно добавить что-то между ними. В этом случае я использовал произвольный фиктивный HTML-тег (чтобы вызвать форматирование, но не мешать самому сообщению). –

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