Как известно, объекты C# имеют указатель на их тип, поэтому при вызове GetType()
он проверяет этот указатель и возвращает реальный тип объекта. Но если я это сделать:Что происходит, когда вы делаете GetType()?
A objA = new A();
object obj = (object)objA;
if (obj.GetType() == typeof(object)) ; // this is true
Но что здесь происходит object obj = (object)objA;
? Создает ли он какой-то ссылочный объект, который ссылается на objA
, но имеет указатель на тип object
, или это совершенно новый объект, который просто указывает на те же свойства, поля и т. Д. Как objA
? Конечно, теперь вы можете получить доступ к обоим объектам, и они будут иметь другой тип, но указывают на одни и те же данные. Как это работает?
Другой вопрос: является ли GetType() гарантией возврата фактического типа объекта? Например, скажем, существует метод с сигнатурой void Method(object sender)
и мы передаем объект типа A
в качестве параметра. Будет sender.GetType()
тип возврата A
, или object
? И почему?
Другое дело, что вы можете сделать (A)obj
, и он будет работать. Как теперь CLR, что obj
был когда-то типа A
?
Был бы рад, если бы кто-то мог сломать его немного яснее, чем «C# через CLR».
Обновление. Мой плохой, должен был запустить код перед отправкой вопроса. Итак, если GetType()
действительно всегда возвращает реальный тип, то все остальные вопросы становятся ясными.
Ваш вопрос основан на совершенно ложном предположении. Строка с надписью «Это верно» неверна. Попробуйте написать небольшую программу, которая фактически компилируется и запускается, если вы мне не верите. GetType() всегда возвращает * фактический тип времени выполнения объекта. Все ваши вопросы основаны на неверном предположении, что тип времени компиляции имеет к этому какое-то отношение. Это не. –
@ Эрик, ну, ты прав, и это то, что я всегда думал, отвлекся от какого-то кода, который по-другому ведет себя в проекте, и я плохой. –