Почему структура С# не может быть унаследована?

Я читаю CLR через С# Джеффри Рихтером, и он говорит, что структура является типом значения и не может быть унаследована. Почему нет? Любые технические причины? Или философские?

Ответ 1

Изменить: Есть серьезные редакционные проблемы по поводу этой должности, по-видимому. См. Раздел комментариев.

Немного обоим.

Философски, это работает - существуют классы, которые являются "реальным" строительным блоком для объектно-ориентированного программирования, и существуют структуры, которые представляют собой легкие типы данных для хранения, но позволяют использовать объекты метод вызывает знакомство и удобство.

Технически, "тип значения" означает, что вся структура - все ее содержимое - (обычно) хранится везде, где у вас есть переменная или член этого типа. В качестве локального параметра или параметра функции это означает, что в стеке. Для переменных-членов это означает, что они хранятся целиком как часть объекта.

В качестве (основного) примера того, почему наследование является проблемой, рассмотрите, как хранилище затронуто на низком уровне, если вы позволили структурам иметь подтипы с большим количеством членов. Все, что хранит этот тип структуры, будет занимать переменный объем памяти, основываясь на том, какой из подтипов он содержал, что было бы кошмаром распределения. Объект данного класса больше не будет иметь заданный размер во время компиляции, и то же самое будет верно для фреймов стека любого вызова метода. Этого не происходит для объектов, у которых есть хранилище, выделенное в куче, и вместо этого имеют ссылки на постоянное значение для этого хранилища в стеке или внутри других объектов.

Это просто интуитивное объяснение высокого уровня. См. комментарии и другие ответы для расширенной и более точной информации.

Ответ 2

Так как структуры представлены в .NET. Они представляют собой типы значений и типы значений, у которых нет указателя таблицы методов, позволяющего наследование.

Ответ 3

Вы можете найти ответы на SO Вопрос Почему типы значений .NET закрыты?. В нем @logicnp ссылается на ECMA 335, в котором говорится:

8.9.10 Наследование типа значения

  • [...]
  • Будет закрыт, чтобы избежать проблем с разделением значений.
  • Более жесткие правила, указанные здесь, обеспечивают более эффективную реализацию без серьезной компрометации.