Смущает бокс. Преобразование -1 в Int64 вызывает исключение InvalidCastException

Хорошо, я, должно быть, не замечаю чего-то чрезвычайно простого, но я заблудился.

Учитывая это

object val = -1;
var foo = (Int32)(val);
var bar = (Int64)(val);

Приведение к Int64 выбрасывает и InvalidCastException.

Я понимаю, что это связано с какой-то странностью с боксом, но я не понимаю причины.

Насколько я понимаю, val помещается в рамку как Int32 в первой строке.

Затем, когда я пытаюсь преобразовать как что-то выбрасывается исключение InvalidCastException, кроме Int32. Полагаю, это означает, что я пытаюсь распаковать val как Int64, хотя на самом деле это Int32?

Все еще кажется странным. Не удалось ли преобразование распаковать значение, а затем попытаться выполнить преобразование?

Что-то вроде (Очевидно, это ужасно упрощено, возможно, упакованный тип неизвестен, поэтому это невозможно?):

object val = -1;
Int32 unboxed = (Int32)(val);
var bar = (Int64)(unboxed);

Кто-то ( читать: Эрик Липперт) Научите меня объяснению этого.

ОБНОВЛЕНИЕ: Из блога Эрика, где Рид разместил ссылку на этот краткий ответ, который я искал

"... Это было бы огромное количество кода для генерации, и это было бы очень медленно . Код, конечно, настолько велик, что вы захотите поместить его в отдельный метод и просто сгенерировать его вызов. Вместо того, чтобы делать это по умолчанию и всегда генерировать код, который является медленным, большим и хрупким, вместо этого мы решили, что при распаковке можно распаковать только конкретный тип. Если вы хотите вызвать медленный метод, который делает все это, он доступен - вы всегда можете вызвать Convert.ToInt32, который выполняет весь этот анализ во время выполнения для Мы даем вам выбор между «быстрым и точным» или «медленным и слабым», и разумным по умолчанию является первое. найдено на других языках.

Поддерживает ли Objective-C блоки "а-ля Smalltalk"?

В Smalltalk блоки похожи на «замыкания», «лямбда-выражения» или «безымянные функции», встречающиеся в других языках.

11
задан cfischer 16 September 2011 в 12:35
поделиться