Есть код
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 неявно хранит указатель на таблицу с метаданными, в которых описан его тип — но это деталь конкретной реализации, на которую опираться не стоит.
Комментариев нет:
Отправить комментарий