упаковка и распаковка, почему оба вывода не являются "System.Object”?

StackOverflow https://stackoverflow.com/questions/3447315

  •  27-09-2019
  •  | 
  •  

Вопрос

Я получил следующий код:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

Результатом является:

System.Int32
System.Object

Почему они не оба System.Object?

Это было полезно?

Решение

Если вы спрашиваете, почему BoxedObject.getType () не возвращает объект .. Проверьте изображение в разделе «Конверсия бокса» на MSDN Page Boxing и Page Page MSDN. Отказ Хороший вопрос, кстати .. По крайней мере, мое понимание вашего вопроса.

Хотя я не могу быть технически правильным, это выглядит

  • При перемещении в кучу создан новый объект - Указатель его типа установлен на объект типа исходного типа значения (здесь System.int32). Это объясняет GetType () (а также ошибку, если вы попытаетесь поддержать его в другой тип).
  • Фактическое значение затем копируется в этот объект.

Другие советы

То GetType() Функция возвращает фактический тип экземпляра в переменной.

Даже если ваша переменная объявляется как object, это на самом деле держа коробка Int32 пример.

Игнорирование темы бокса, все классы наследуют от типа объекта. Это верно для таких типов опорных типов, так и для типов значений. GetType показывает наиболее полученный тип, который в этом случае является System.int32.

Один из немногих раз getType собирается вернуть систему .Object: если вы сделаете это:

object var = new Object();
Console.WriteLine(var.GetType().ToString());

Бокс относится к, когда тип значения указан на ссылочный тип. Как правило, это делается как система .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());

Класс
Кладс
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 - это моя аббревиатура object, а b - для System.Int32

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top