Delphi: вывод общего типа ссылочного аргумента - PullRequest
2 голосов
/ 08 апреля 2011

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

Обновление : Я не против других (в том числе неуниверсальных) решений, если они работают с несколькими (любыми?) Типами.

Это, похоже, до сих пор не решено, хотя известно довольно давно.

Пожалуйста, проголосуйте за решение этой проблемы на Embarcaderos Quality Central: Выпуск # 78103 .

Из комментария Барри Келли до Универсальные методы и определение типов :

PS: Ваш пример в Тибуроне почти работает. Вывод типа метода хорошо работает для аргументов, передаваемых по значению. К сожалению, он не работает для аргументов, передаваемых по ссылке (компилятор слишком строг).

Теперь, почти три года спустя, я пытаюсь сделать то же самое в Delphi XE, и он жалуется, что:

[Ошибка DCC] INIv1_Parser.pas (81): E2033 Типы фактических и формальных параметров var должны быть идентичны

При звонке:

function FindDataItemValue<T>(ItemType: TDataItemType; out Value: T): Boolean;

С:

var MaxG: Real;
...
if Data.FindDataItemValue(PAR_MaxG, MaxG) and (MaxG = 2.5) then ...

Обычно предлагаемый обходной путь : Однако, если я добавлю обобщение к вызову, все будет работать отлично; хотя раздражает, что это даже нужно.

Обновление

Пока что лучшее, что я придумал, - это использовать Variants или запись TValue из модуля Rtti. Используя варианты, я реализую интерфейсы, когда мне нужно использовать объекты, и сохраняю ссылку на них (интерфейс) в варианте.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2011

Вывод типа в настоящее время не работает для параметров var и out.Я согласен, что это очень раздражает.

1 голос
/ 13 апреля 2011

Обходного пути нет. Вы должны указать тип.

var
  MaxG: Real;
...
  if Data.FindDataItemValue<Real>(PAR_MaxG, MaxG) and (MaxG = 2.5) then ...

Если вы хотите, чтобы Embarcadero решил эту проблему, проголосуйте за эту запись КК, касающуюся вашей проблемы .

Записи КК с наибольшим количеством голосов привлекают больше внимания.

0 голосов
/ 08 апреля 2011

Лучший способ - сделать именно то, что продемонстрировано в цитируемой вами статье: включить параметры типа в вызов метода:

if Data.FindDataItemValue<Real>(PAR_MaxG, MaxG) ...
...