Как структура может наследовать от класса в параметрах типа? - PullRequest
4 голосов
/ 24 февраля 2009

Я увидел следующую строку кода:

class Sample<T,U> where T:class where U: struct, T

В приведенном выше случае параметр U равен типу значения и является производным от типа ссылки T.

Как эта строка может быть законной?
Кроме того, если тип значения наследуется от ссылочного типа, где выделяется память: куча или стек?

Ответы [ 5 ]

6 голосов
/ 24 февраля 2009

Вопреки другому ответу, есть другие типы, кроме T = System.Object, где это компилируется:

class Samplewhere T:class where U:struct, T

Ограничение "T: class" на самом деле не означает, что T должен быть классом. Это означает, что T должен быть ссылочным типом. Это включает интерфейсы, и структуры могут реализовать интерфейсы. Так, например, T = IConvertible, U = System.Int32 работает отлично.

Я не могу себе представить, что это особенно распространенное или полезное ограничение, но оно не вполне настолько противоречиво, как кажется на первый взгляд.

Что касается более общего положения: как говорит Обиван Кеноби, все зависит от вашей точки зрения. Спецификация CLI имеет довольно сложное объяснение этого, где «происхождение от» и «наследование от» не означают совсем одно и то же, IIRC. Но нет, вы не можете указать базовый тип типа значения - это всегда либо System.ValueType, либо System.Enum (что происходит от System.ValueType), и это выбирается на основе того, объявляете ли вы struct или enum. Несколько странно, что оба они являются ссылочными типами ...

2 голосов
/ 24 февраля 2009

Все структуры наследуются от типа ValueType неявно. Вы не можете указать явный базовый тип.
Обратитесь к этому руководству MSDN по структурам , опубликованному codemelt.

  • Когда вы создаете экземпляр структуры, например, как локальная переменная, они размещаются в стеке (лучшая производительность)
  • Классы могут содержать структуры в качестве членов - в этом случае они размещаются в куче.
1 голос
/ 24 февраля 2009

Саша написал:

Если наследство не разрешено, тогда почему следующий закон:

класс Samplewhere T: класс где U: структура, T

В случае выше, параметр U тип значения, и это происходит от T - ссылочный тип

Хотя это допустимо с точки зрения общего контракта, вы никогда не получите никакого полезного кода, который использует этот класс для компиляции, поскольку у вас никогда не будет другого типа, кроме T = System.Object, который удовлетворяет ограничению U. Вы можете подумать, что это очень незначительная ошибка в реализации обобщений в C #.

1 голос
/ 24 февраля 2009

MSDN говорит,

Нет наследования для структур, как есть для занятий. Структура не может наследовать от другой структуры или класса, и это не может быть основой класса. Структуры, однако, наследуют от объект базового класса. Структура может реализовать интерфейсы, и это делает точно так, как делают классы.

0 голосов
/ 24 февраля 2009

Структуры не могут наследоваться от чего-либо, кроме System.ValueType или System.Enum. Нет способа, которым структура может наследоваться от обычного ссылочного типа. К сожалению, на этот вопрос нельзя ответить.

...