Delphi - неявный оператор Typecast не работает для параметров метода - PullRequest
4 голосов
/ 30 мая 2019

Я пишу своего рода оболочку массива, использую запись в качестве контейнера и включаю в нее некоторые "классоподобные" функции.Я также хочу иметь возможность присвоить ему массив, как и в случае с обычным массивом, поэтому я реализовал оператор класса Implicit:

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;

Что может происходить?

Заранее спасибо.

1 Ответ

4 голосов
/ 30 мая 2019

Компилятор не реализовал строковые операции над динамическим массивом для операторов класса, когда в качестве параметра используется запись / класс.

Насколько я вижу, для этого нет отчета о 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 не принимают динамические массивы, переданные в скобках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...