Может ли класс ref храниться по значению в управляемом классе? - PullRequest
2 голосов
/ 13 января 2020

Допустим, у меня есть управляемый тип Foo:

ref class Foo
{};

И управляемый тип Bar:

ref class Bar
{
   Foo foo;
};

Обратите внимание, что Bar не содержит Foo^, но a Foo.

Предположим, что Bar равно gcnew 'd.

Это разрешено?

Компилируется без предупреждения, но документация гласит:

Типы ссылок (ref) могут быть созданы только в управляемой куче, но не в стеке или в собственной куче. Типы значений могут быть созданы в стеке или управляемой куче.

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

Причина Я спрашиваю, возможно, я вижу некоторые доказательства того, что мой foo поврежден, когда я позже получу к нему доступ; MCVE, возможно, последует в следующем вопросе, в зависимости от результата этого!

1 Ответ

1 голос
/ 13 января 2020

Кажется, это действительно.

Язык указывается как ECMA-372 , что, по-видимому, не предотвращает это (хотя я не могу сразу найти какой-либо для него также явно указана семантика.

В частности, в §23 (p141) перечислены ограничения на «смешанные типы»:

Это предложение зарезервировано для возможного использования в будущем.

Смешанный тип - это собственный класс, класс ref или собственный массив, который требует, чтобы члены объекта, либо посредством объявления, либо по наследованию, были размещены как в куче CLI, так и в некоторой другой части памяти.

Примеры смешанных типов:

  • Собственный класс, содержащий член, тип которого является непростым типом значения, типом ссылки или типом интерфейса.
  • A Собственный массив элементов, тип которого является типом значения, отличным от фундаментального типа или типа ref-класса.
  • Класс ref или класс-значение, содержащий член, тип которого является собственным классом или собственным массивом.

A p rogram, который определяет или объявляет смешанный тип, плохо сформирован.

… и ваш пример не один из них. Я ожидаю найти его там, если он будет запрещен.

(не уверен, что происходит с первым абзацем)

...