Хорошо, я, должно быть, не замечаю чего-то чрезвычайно простого, но я заблудился.
Учитывая это
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 блоки похожи на «замыкания», «лямбда-выражения» или «безымянные функции», встречающиеся в других языках.