Прозрачный ввод текста без полей

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

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

Вывод:

System.Int32
System.Object

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

8
задан hello_there_andy 18 May 2015 в 19:46
поделиться

5 ответов

Если вы спрашиваете, почему boxedObject.GetType () не возвращает Object… просмотрите изображение в разделе «Конвертация бокса» на странице упаковки и распаковки MSDN ]. Кстати, хороший вопрос ... по крайней мере, я понимаю ваш вопрос.

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

  • При перемещении в кучу создается новый объект - его указатель Type устанавливается на объект Type исходного типа значения (здесь System. Int32). Это объясняет GetType () (а также ошибку, если вы попытаетесь распаковать его в другой тип).
  • Фактическое значение затем копируется в этот объект.
4
ответ дан 5 December 2019 в 10:38
поделиться

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

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

7
ответ дан 5 December 2019 в 10:38
поделиться

Игнорируя тему бокса, все классы наследуются от объекта типа. Это верно как для ссылочных типов, так и для типов значений. 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

3
ответ дан 5 December 2019 в 10:38
поделиться

Дело не в боксе, а в поведении GetType. Он возвращает тип значения переменной, а не тип, с которым переменная была объявлена:

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

не возвращает System.Object.

1
ответ дан 5 December 2019 в 10:38
поделиться

объявления переменных - это информация только во время компиляции, тогда как выполнение метода - во время выполнения. Другими словами, GetType () не может узнать, какой тип объекта был объявлен, поскольку он может знать только фактический тип объекта во время выполнения.

аналогично, если у вас был

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

вызов bInstance.GetType (), у вас нет возможности узнать, что переменная была объявлена ​​как тип 'a', и я не думаю, что вы ожидаете, что она вернет 'a' в этом случае либо. Однако в приведенном выше примере a - это мое сокращенное обозначение объекта, а b - для System.Int32

1
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: