Я получил следующий код:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
Вывод:
System.Int32
System.Object
Почему они не оба System.Object
?
Если вы спрашиваете, почему boxedObject.GetType () не возвращает Object… просмотрите изображение в разделе «Конвертация бокса» на странице упаковки и распаковки MSDN ]. Кстати, хороший вопрос ... по крайней мере, я понимаю ваш вопрос.
Хотя я могу быть технически не прав, это выглядит так
Функция GetType ()
возвращает фактический тип экземпляра в переменной.
Даже если ваша переменная объявлена как объект
, на самом деле она содержит упакованный экземпляр Int32
.
Игнорируя тему бокса, все классы наследуются от объекта типа. Это верно как для ссылочных типов, так и для типов значений. GetType показывает наиболее производный тип, которым в данном случае является System.Int32.
Один из немногих случаев, когда GetType будет возвращать System.Object, если вы сделаете это:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
Упаковка относится к тому, когда на тип значения указывает ссылочный тип. Обычно это делается как ссылка на System.Object. TypeOf вернет наиболее производный фактический тип, а не ссылочный тип.
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
GetType будет делать аналогичные вещи для этих типов.
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
ClassA
ClassB
ClassC
Дело не в боксе, а в поведении GetType
. Он возвращает тип значения переменной, а не тип, с которым переменная была объявлена:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
не возвращает System.Object
.
объявления переменных - это информация только во время компиляции, тогда как выполнение метода - во время выполнения. Другими словами, GetType () не может узнать, какой тип объекта был объявлен, поскольку он может знать только фактический тип объекта во время выполнения.
аналогично, если у вас был
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
вызов bInstance.GetType (), у вас нет возможности узнать, что переменная была объявлена как тип 'a', и я не думаю, что вы ожидаете, что она вернет 'a' в этом случае либо. Однако в приведенном выше примере a - это мое сокращенное обозначение объекта, а b - для System.Int32