Опоздал на вечеринку по этому поводу, но ...... Мне не нравится просто читать ответы и без доказательств за ними. Мне нравится понимать проблему, анализировать возможное решение и смотреть, связано ли оно с моим пониманием. Это копирование и вставка текста из по достоинству признанного превосходного «CLR via C #» бога Джеффа Рихтера объясняет это:
Несмотря на то, что у незаписанных типов значений нет указателя на объект типа, вы все равно можете вызывать виртуальные методы (такие как Equals, GetHashCode или ToString), унаследованные или переопределенные типом. Если ваш тип значения переопределяет один из этих виртуальных методов, то CLR может вызывать метод не виртуально, потому что типы значений неявно запечатаны и не могут иметь никаких производных от них типов. Кроме того, экземпляр типа значения, используемый для вызова виртуального метода, не упакован. Однако, если ваше переопределение виртуального метода вызывает реализацию метода базового типа, то экземпляр типа значения блокируется при вызове реализации базового типа, так что ссылка на объект кучи передается указателю this в базу метод. Однако для вызова не виртуального унаследованного метода (такого как GetType или MemberwiseClone) всегда требуется, чтобы тип значения был упакован, поскольку эти методы определены System.Object, поэтому методы ожидают, что аргумент this будет указателем, который ссылается на объект куча.
Мистер Рихтер должен получить медаль за эту книгу. Если у вас его нет, то получите !! Тогда вы получите:)