Код выведет 2, затем 1, после чего выбросит InvalidCastException. В obj упакована копия int, а прямое распаковывание её как short недопустимо.
int i = 1;
Код выведет 2, затем 1, после чего выбросит InvalidCastException. В obj упакована копия int, а прямое распаковывание её как short недопустимо.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
int i = 1; object obj = i; ++i; Console.WriteLine(i); Console.WriteLine(obj); Console.WriteLine((short)obj);
Ответ
Код выведет 2, затем 1, после чего выбросит InvalidCastException. В obj упакована копия int, а прямое распаковывание её как short недопустимо.
При object obj = i значение 1 копируется в отдельный boxed int. Последующее ++i меняет только локальную переменную, поэтому выводы i и obj различаются.
Unboxing требует соответствующего упакованному значению типа. Сначала нужно извлечь int и только затем преобразовать число: Console.WriteLine((short)(int)obj);. В этом примере результат был бы 1. Для произвольного значения сужающее преобразование требует проверки диапазона, например checked.