Как GetType() знает тип производного класса?

Почему это работает:

Object o = "my string";
Console.WriteLine(o.GetType());

Вывод:

System.String

Это имеет смысл, если вызов функции был отправлен в класс String, но это не так, поскольку GetType() не является виртуальным.

Ответ 1

Тип времени выполнения является частью данных самого объекта. Это почти похоже на скрытое поле только для чтения в System.Object, а GetType() просто возвращает значение этого поля. (Это не совсем так просто, но это разумное приближение.)

Обратите внимание, что эта информация необходима для того, чтобы среда CLR работала над тем, где отправлять виртуальные методы, поэтому, если бы вы думали, что это сработает, если GetType были виртуальными, спросите себя, как CLR узнает, какую реализацию вызывать.