Ключевым моментом здесь является то, что GetType()
не является виртуальным и не может быть переопределено. Поскольку структура фактически sealed
, методы не могут быть переопределены на больше , чем структура, поэтому среда выполнения и компилятор могут обрабатывать методы структуры , которые были переопределены , как статические вызовы. *
Если вы пишете структуру (редко), вы должны переопределить все методы, такие как ToString()
, Equals()
, GetHashCode()
именно по этой причине. Если вы этого не сделаете, он должен боксировать. Тем не менее, GetType()
нельзя переопределить , поэтому требуется бокс.
Это на самом деле приводит к некоторым странным крайним случаям с Nullable<T>
и боксом, поскольку пустые Nullable<T>
боксы к null
, поэтому:
int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom