Как объявить заданный тип типа перечисления в универсальном классе

Я столкнулся с каким-то странным поведением в Delphi XE4.

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

Например:

TTest<T> = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;

Вышеупомянутое не компилируется. Компилятор выдает ошибку "E2001: требуется порядковый номер".

Необщий класс, например

TTest = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;

компилируется.

Чтобы общий класс успешно скомпилировался, порядковый номер должен быть объявлен вне класса:

TEnumType  = (eOne, eTwo, eThree);
TTest<T> = class(TObject)
type
  TEnumTypes = set of TEnumType;
end;

  1. Такое поведение считается ошибкой? Если да, было ли это исправлено в более поздней версии?
  2. У кого-нибудь есть другой обходной путь? Я хотел объявить типы внутри класса, потому что они используются исключительно в приватных частях этого класса.

person René Hoffmann    schedule 26.10.2016    source источник
comment
В Сиэтле работает нормально. Только что проверил. Скорее всего, это проблема компилятора XE4. У нас было много проблем с дженериками во времена XE4.   -  person Z.B.    schedule 26.10.2016
comment
Вопросы вроде здесь оффтоп, надо адресовать Emc. Но ответ вполне очевиден, код может быть без проблем скомпилирован в последней версии Delphi, поэтому 1. это ошибка, и она исправлена, и 2. вы предложили обходной путь в своем вопросе - определить TEnumType вне универсального класса (в реализации раздел, если вы хотите скрыть его как частный).   -  person Andrei Galatyn    schedule 26.10.2016
comment
@AndreiGalatyn, 1. Но ответ вполне очевиден, код без проблем скомпилируется в последней версии Delphi. Как это очевидно, если у OP есть XE4? 2. Использование раздела реализации не будет работать, потому что OP нужны приватные поля TEnumType, которые объявлены в разделе интерфейса.   -  person kobik    schedule 26.10.2016
comment
@kobik Любой может получить бесплатную/пробную версию последнего компилятора Delphi. Очевидно, что ошибки в компиляторе следует тестировать в последней версии компилятора.   -  person Andrei Galatyn    schedule 26.10.2016
comment
@AndreiGalatyn, по вашему предложению, если у меня есть ошибка компилятора, например, в Delphi7, мне нужно установить все бесплатные/пробные более поздние версии Delphi, пока я не смогу (надеюсь) успешно скомпилировать свою программу, вместо того, чтобы просить на SO или исследования в сети? Лично я не собираюсь этого делать...   -  person kobik    schedule 26.10.2016
comment
Мне кажется странным, что мы все согласны с тем, что ошибки исправляются только в новой версии компилятора, а не в обновлении той же версии...   -  person Remko    schedule 26.10.2016
comment
FWIW Всякий раз, когда вы помещаете вложенный тип в универсальный тип, спросите себя: хочу ли я, чтобы здесь был другой тип для каждого закрытого универсального типа, или они на самом деле все выглядят одинаково - как в этом случае с перечислением. ИМО имеет смысл только тогда, когда вложенный тип основан на одном или нескольких параметрах типа. Если вы просто хотите сделать некоторые вещи приватными, рассмотрите возможность добавления неуниверсального базового класса в качестве предка к универсальному классу, куда вы можете поместить весь неуниверсальный связанный код.   -  person Stefan Glienke    schedule 26.10.2016


Ответы (2)


Судя по трекеру проблем, кажется, что это регресс вокруг XE3/XE4, который был исправлен в более поздних версиях:

person Stefan Glienke    schedule 26.10.2016
comment
Обратите внимание, что QualityCentral закрыт, поэтому вы можете больше не могу получить доступ к qc.embarcadero.com ссылкам. Если вам нужен доступ к старым данным контроля качества, посмотрите QCScraper. - person Remy Lebeau; 09.06.2017

Это действительно ошибка, которая исправлена ​​в более поздних версиях. Например, ваш код компилируется в XE7. Вполне возможно, что он скомпилируется в XE5 или XE6, но у меня их нет под рукой, чтобы проверить.

person David Heffernan    schedule 26.10.2016