Задание значения в коробке

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

object o = 12;
double d = (double)o;

Это вызывает недопустимое исключение лита. Вместо этого кажется, что сначала он должен быть отброшен как int, а затем на double.

object o = 12;
double d = (double)(int)o;

Я уверен, что простой ответ "потому что это работает бокс", но я надеюсь, что кто-то может пролить немного света здесь.

Ответы

Ответ 1

Проверьте этот вопрос ранее: Почему я получаю InvalidCastException?

Операции Unboxing выполняются только в том случае, если целевой тип точно совпадает с исходным типом, который был помещен в бокс, поэтому генерируется исключение. Эта ссылка, которую подробно объяснил Джон Лейдегрен.

Ответ 2

Если во время компиляции вы не знаете оригинальный тип:

object o = 12;
double d = (double)Convert.ChangeType(o, typeof(double));