Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Как хранятся типы в object[] ?

Есть код static void Main(string[] args) {
object[] objects = new object[] {1, "asd", 'a'}; foreach (var elem in objects) { Console.WriteLine(elem.GetType().ToString()); }
Console.ReadKey(); } Выводятся типы System.Int, System.String, System.Char. Вопрос - откуда компилятор знает о типах если явного приведения нет, обратиться из кода к методам объектов нельзя (кроме обжектовских). Мне казалось, что должны вывести System.Object, однако выводит правильно.


Ответ

Смотрите. В .NET (как и в любом объектно-ориентированном языке) переменная-ссылка базового типа может указывать на объект производного типа. Вспомним, что в .NET object является предком всех типов. Это значит, что переменная может содержать фактически любой тип. Итак, у нас есть различие между compile-time-типом (тип ссылки) и runtime-типом (фактическим типом объекта, на который эта ссылка ссылается). Теперь, GetType(), согласно документации, возвращает именно runtime-тип, то есть настоящий тип объекта по ссылке. Каким именно образом это реализовано, для программиста не должно быть важно. На самом деле, каждый объект в .NET неявно хранит указатель на таблицу с метаданными, в которых описан его тип — но это деталь конкретной реализации, на которую опираться не стоит.

Комментариев нет:

Отправить комментарий