Невозможно наследовать от С# struct. Для меня это не очевидно, почему это:
- Очевидно, что у вас не может быть ссылочного типа, который наследуется от типа значения; это не сработает
- Неразумно наследовать от одного примитивного типа (Int32, Double, Char и т.д.).
- Вам нужно будет иметь возможность вызывать (не виртуальные) методы на базе с использованием производного экземпляра. Вы можете отличить от производной структуры до базы, поскольку они будут перекрывать одну и ту же память. Я думаю, что отбрасывание с базы на производную не сработало бы, так как вы не могли знать тип производной структуры во время выполнения.
- Я вижу, что вы не могли реализовать виртуальные методы в своей иерархии классов, поскольку типы значений не могут иметь виртуальных членов
Интересно, является ли это техническим ограничением в CLR или чем-то, что компилятор С# не позволяет вам делать?
Изменить: Типы значений не могут иметь виртуальные методы, и я понимаю, что это ограничение исключает большинство сценариев, в которых вы хотели бы использовать наследование. Тем не менее, это все еще оставляет наследование-как-агрегацию. Представьте себе структуру Shape
с полем Colour
: я могу написать код, который принимает любую структуру, полученную из Shape
, и получить доступ к своему полю Colour
, даже если я никогда не могу написать виртуальный метод Shape.Draw
.
Я могу вспомнить один сценарий, который будет разбит непечатаемыми типами значений. Предполагается, что типы значений реализуют Equals
и GetHashCode
правильно; даже несмотря на то, что эти два метода на System.Object
являются виртуальными, их называют не виртуальными по типам значений. Даже если типы значений не были запечатаны, кто-то, написавший структуру, полученную из другого, не мог написать собственную реализацию этих двух методов и ожидать, что их правильно назовут.
Я должен указать, что я не предлагаю, чтобы я мог наследовать от структур в моем собственном коде. Тем не менее, я пытаюсь понять, почему этот специфический запах кода запрещен .NET.
Изменить 2: Я просто заметил этот очень похожий вопрос, ответ на который эффективно ", потому что тогда массивы значений типов wouldn ' t work".