Я пишу своего рода оболочку массива, используя запись в качестве контейнера и включая в нее некоторые «классоподобные» функции. Я также хочу иметь возможность присвоить ему массив, как обычному массиву, поэтому я реализовал неявный оператор класса:
type
TArrayWrapper = record
class operator Implicit(AArray: array of TObject): TArrayWrapper; overload;
Items: TArray<TObject>;
procedure Add(AItem: TObject);
...
end;
Итак, я могу делать такие вещи, как:
procedure DoSomething;
var
myArray: TArrayWrapper;
begin
myArray := [Obj1, Obj2, Obj3];
...
end;
Проблема возникает, когда я пытаюсь передать массив Integer методу, который имеет в качестве параметра TArrayWrapper:
procedure DoSomethingElse(AArrayWrapper: TArrayWrapper);
begin
...
end;
procedure DoSomething;
var
myArray: TArrayWrapper;
begin
myArray := [Obj1, Obj2, Obj3];
DoSomethingElse(myArray); <--- Works!!!!
DoSomethingElse([Obj1, Obj2, Obj3]); <--- Error E2001: Ordinal type required -> It is considering it like a set, not as an array
end;
Что может происходить?
Заранее спасибо.
Компилятор не реализовал строковые операции над динамическим массивом для операторов класса, когда в качестве параметра используется запись/класс.
Насколько я вижу, для этого нет отчета QP.Теперь есть, см. ниже.
Подобный пример можно найти в комментариях здесь: Динамические массивы в Delphi XE7
Обходной путь:
DoSomethingElse(TArray<TObject>.Create(Obj1, Obj2, Obj3));
Или, как предлагает @Stefan, чтобы избежать ненужных выделений. Добавьте в запись конструктор:
type
TArrayWrapper = record
class operator Implicit(AArray: array of TObject): TArrayWrapper;
constructor Init( const AArray: array of TObject);
end;
DoSomethingElse(TArrayWrapper.Init([obj1,obj2,obj3]));
Сообщается как: Операторы класса RSP-24610 не принимают динамические массивы, передаваемые со скобками
В качестве обходного пути я бы предпочел добавить ctor для типа TArrayWrapper
с параметром array of TObject
, чем выполнять немедленное динамическое выделение массива и неявный вызов оператора плюс добавленный компилятор CopyRecord
@StefanGlienke, спасибо. Добавил ваше предложение в ответ. Я сообщу об этом QP позже сегодня.
Я уже использовал это решение. Код менее элегантен, чем просто передача массива, но он работает. Спасибо большое.
Это недостаток компилятора