Sorry no reasons, but this one is not limited to TArray,
Using the following type definitions:
TGenClass<T> = class fx: T; end;
TGenArray<T> = array of T;
TGenRecord<T> = record fx: T; end;
TGenProc<T> = procedure(const A: T);
I have tried all combinations:
TGenClassClass<T> = TGenClass<TGenClass<T>>;
TGenClassArray<T> = TGenClass<TGenArray<T>>;
TGenClassRecord<T> = TGenClass<TGenClass<T>>;
TGenClassProc<T> = TGenClass<TGenClass<T>>;
TGenArrayClass<T> = TGenArray<TGenClass<T>>;
TGenArrayArray<T> = TGenArray<TGenArray<T>>;
TGenArrayRecord<T> = TGenArray<TGenClass<T>>;
TGenArrayProc<T> = TGenArray<TGenClass<T>>;
TGenRecordClass<T> = TGenRecord<TGenClass<T>>;
TGenRecordArray<T> = TGenRecord<TGenArray<T>>;
TGenRecordRecord<T> = TGenRecord<TGenClass<T>>;
TGenRecordProc<T> = TGenRecord<TGenClass<T>>;
TGenProcClass<T> = TGenProc<TGenClass<T>>;
TGenProcArray<T> = TGenProc<TGenArray<T>>;
TGenProcRecord<T> = TGenProc<TGenClass<T>>;
TGenProcProc<T> = TGenClass<TGenProc<T>>;
They all fail.
You can declare types with complex type expressions, if those types are not generic themself:
TClassClass = TGenClass<TGenClass<Integer>>
TClassArray = TGenClass<TGenArray<Integer>>
TClassRecord = TGenClass<TGenClass<Integer>>
TClassProc = TGenClass<TGenClass<Integer>>
TArrayClass = TGenArray<TGenClass<Integer>>
TArrayArray = TGenArray<TGenArray<Integer>>
TArrayRecord = TGenArray<TGenClass<Integer>>
TArrayProc = TGenArray<TGenClass<Integer>>
TRecordClass = TGenRecord<TGenClass<Integer>>
TRecordArray = TGenRecord<TGenArray<Integer>>
TRecordRecord = TGenRecord<TGenClass<Integer>>
TRecordProc = TGenRecord<TGenClass<Integer>>
TProcClass = TGenProc<TGenClass<Integer>>
TProcArray = TGenProc<TGenArray<Integer>>
TProcRecord = TGenProc<TGenClass<Integer>>
TProcProc = TGenClass<TGenProc<Integer>>
There is a circumvention. You can declare the type within a class with a type parameter.
type
TTheClass<T> = class
type
TGenClassClass = TGenClass<TGenClass<T>>;
end;
So you can use TTheClass<T>.TGenClassClass
as a type.
TDynMatrix<T> = array of array of T;
compiles. – LU RDTArray<>
is that you escape that particular tyranny. – David Heffernan