ExecuteReader
не возвращает объект - он возвращает ссылку на объект некоторого типа, который реализует IDataReader
(или ноль, конечно).
Идея состоит в том, что вызывающий / клиент не должен знать о реализации класса, просто он реализует интерфейс. Когда клиент вызывает метод, такой как reader.Next()
, он будет использовать реализацию, основанную на типе времени выполнения объекта, к которому относится значение reader
.
Присвоение ссылочного значения переменной не меняет тип объекта, на который ссылается эта ссылка. Например:
string text = "hello";
object o = text;
Теперь o
и text
имеют одно и то же значение - ссылку на одну и ту же строку. Если вы звоните:
Type t = o.GetType();
, который по-прежнему будет возвращать ссылку на объект Type
, представляющий System.String
, поскольку значение o
относится к объекту String
; тип переменной, через которую вы получаете доступ к объекту, не меняет тип времени выполнения объекта.