Типы значений в .net странная в том, что они определили, что они являются классами, полученные из специального класса под названием ValueType
, и для каждого типа значения есть тип объекта кучи, которая ведет себя как объект класса, который является производным от ValueType
, но хранилище данных типа ценности содержит коллекцию байтов, которая представляет либо примитивное значение, либо объединение байтов, необходимых для хранения всех его публичных и частных полей. Поскольку места хранения типа значений просто содержат байты, необходимые для представления их значений, и не содержат ни информации о типе, ни ссылки на объект, который будет хранить информацию о типе, код, который использует хранилище типа значения, должен точно знать, что это такое. Обычное наследование требует, чтобы объекты содержали информацию об их собственном типе, но нет никаких положений, посредством которых типы значений могли бы это сделать.
Было бы концептуально можно (и полезно) для .net, чтобы некоторые ограниченные формы наследования значения типа с некоторыми специальными правилами, например, что в то время как BaseStructure
переменная может держать BaseStructure
только и не мог держать DerivedStructure
, можно определить StructureUser<T> where T:BaseStructure
, и такой класс или метод может принимать любые производные от BaseStructure
и использовать эти элементы, включая поля, которые являются общими для базового типа.К сожалению, было бы сложно определить правила для дженериков таким образом, чтобы вести себя последовательно в разрешенных сценариях и, тем не менее, не нарушать существующий код. Например, в классе Foo<T,U> where T:U
это всегда можно хранить T
переменного типа U
, даже если U
является типом значения (в этом случае, так как типы значений запечатаны, T
и U
гарантированы то же тип). Если U
может быть наследуемым типом значений, а T
может быть производным, такая гарантия не будет сохранена. Учитывая трудности, связанные с таким наследованием, более полезной альтернативой было бы предоставление безопасного (даже если ограниченного) средства, через которое свойство могло бы вызывать byref или const-byref (byref - это то, что передается при использовании параметра a ref
). Такая функция устранит неизбежное семантическое различие между полями и свойствами и в зависимости от того, как оно было реализовано, может предложить некоторые основные преимущества даже при использовании с классами (например, это может обеспечить эффективное смешивание неизменяемых и изменяемых типов).
Структуры и классы разные, нет класса типа структуры, его либо одного, либо другого. – Freeman
Должно быть что-то еще ... Это весь ваш код? –