Был вопрос, что будет выведено на консоль в результате выполнения следующего кода:
int i = 1;
object obj = i;
i;
Console.WriteLine(i);
Console.WriteLine(obj);
Console.WriteLine((short)obj);
Я на этот вопрос ответила неправильно. Подскажите пожалуйста правильный ответ, и почему именно этот ответ будет правильным
using System;
public class Program
{
public static void Main()
{
int i = 1;
object obj = i;
i;
Console.WriteLine(i);
Console.WriteLine(obj);
//Console.WriteLine((short)obj); исключение "невозможно привести тип"
Console.WriteLine(typeof(Int32) == obj.GetType()); // obj, логично, имеет тип Int32, но мы на всякий случай удостоверимся
Console.WriteLine((short)1); //здесь ошибки не возникает, тобишь Int32 спокойно можно привести к типу short
//Console.WriteLine((short)obj); //а вот здесь возникает, не смотря на то, что значение переменной obj равно 1
Console.WriteLine((double)obj); //ошибка есть
Console.WriteLine(Convert.ToDouble(obj)); //ошибки нет
}
}
Почему это так? - Потому что преобразование этих типов не разрешено. Нельзя просто взять и преобразовать тип int в short, doulbe и тд. Конвертировать - можно, преобразовать - нет.
Почему же когда передавать единицу то всё нормально получается? Да потому что компилятор прекрасно понимает что вы хотите сделать и не преобразовывает её, поскольку в этом просто нет смысла. Он пишет ту самую единицу, но единица эта всё равно остаётся целочисленной.