Если мы посмотрим на метод .NET Framework Reference Source Object.GetType (), быстро выясняется, что в действительности нет ничего интересного:
// Returns a Type object which represent this object instance.
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
Обратите внимание, что этот методне помечен как виртуальный, но ведет себя как виртуальный - для каждого объекта возвращается фактический тип.Это связано со специальной внутренней реализацией.Значение атрибута InternalCall означает, что метод реализован внутри CLR.Благодаря CoreCLR мы можем смотреть глубже.Если мы хотим найти реализацию внутренней функции InternalCall, мы смотрим на исходный файл CoreCLR. \ Src \ vm \ ecalllist.h, где есть адекватное отображение.В нашем случае это
FCFuncStart(gObjectFuncs)
FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType)
FCFuncElement("MemberwiseClone", ObjectNative::Clone)
FCFuncEnd()
И, таким образом, мы приходим к реализации (здесь и далее я опускаю не релевантный код):
// This routine is called by the Object.GetType() routine. It is a major way to get the Sytem.Type
FCIMPL1(Object*, ObjectNative::GetClass, Object* pThis)
{
// ...
OBJECTREF objRef = ObjectToOBJECTREF(pThis);
if (objRef != NULL)
{
MethodTable* pMT = objRef->GetMethodTable();
OBJECTREF typePtr = pMT->GetManagedClassObjectIfExists();
if (typePtr != NULL)
{
return OBJECTREFToObject(typePtr);
}
}
else
FCThrow(kNullReferenceException);
FC_INNER_RETURN(Object*, GetClassHelper(objRef));
}
FCIMPLEND
Короче, то, что мы видим здесь, получаеттак называемый MethodTable объекта (Object :: GetMethodTable) и возвращающий соответствующий объект Type (MethodTable :: GetManagedClassObjectIfExists) или создающий его, если таковой не существует (GetClassHelper) 1).Здесь мы должны на мгновение остановиться и для ясности разделить наше обсуждение на отдельные этапы.
Отвечая на ваш вопрос: «Все ли на самом деле наследуется от Type вместо object?»вопрос - точно нет.