[fpc-pascal] Open array compatibility

Michael Van Canneyt michael at freepascal.org
Sat Oct 15 10:58:20 CEST 2022



On Sat, 15 Oct 2022, Hairy Pixels via fpc-pascal wrote:

> Another question I just ran in to. Why isn’t "array of TMyClass” compatible with “array of TObject” open array? TMyClass is a descendant of TObject and dynamic arrays are compatible with open arrays right?
>
> ======================
>
> type
>  TMyClass = class
>  end;
>
> procedure MyProcedure(values: array of TObject); 
> begin
> end;
>
> var
>  myArray: array of TMyClass;
> begin
>  MyProcedure(myArray); // error: Incompatible type for arg no. 1: Got "{Dynamic} Array Of TMyClass", expected "{Open} Array Of TObject"

Rougly said:
Arrays are considered equal if the element type is equal.
And equal does not mean 'inherits from'.

One reason we do not allow descendents is that if you have a var array, the
returned value may contain classes of a type that the caller does not expect.
(This is the same reason why (var value: TObject) requires an exact match in type)

But a case could be made to allow it in case the parameter is passed by value.

You can force it with a typecast:

Type
   TObjectArray = Array of Object;

var
   myArray: array of TMyClass;

begin
   MyProcedure(TObjectArray(myArray)); 
end.

But then you're on you own, as you are deliberately bypassing the compiler's
typechecking (as is the case with all typecasts...).

Michael.


More information about the fpc-pascal mailing list