Das Problem ist halt, daß BaseT zur Compilezeit und an dieser Stelle noch nicht bekannt ist.
Leider arbeitet der Compiler nur in einem Durchgang, so daß der Code nicht nochmal übersetzt wird ... SizeOf bekommt also niemals den Ersatztypen mit, welchen man bei einer späteren Verwendung des GenTyps angibt.
Nö, prinzipiell kennt der Compiler die Größe von BaseT schon. Noch ein (seeeehr) experimenteller Stand war nämlich sowas:
Delphi-Quellcode:
FixedSizeUnicodeString<BaseT> = record
strict private
FBufferPart1: T;
FBufferPart2: T;
end;
Dann hatten Instantiierungen von FixedSizeUnicodeString zumindest die richtige SizeOf. Dafür hat's dann wieder woanders gehakelt, mal abgesehen davon, dass das eine Move/FillChar/Cast/Pointerarithmetik-Orgie geworden wäre.
Aus irgendeinem Grund verrät der Compiler uns aber die Größe nicht, auch wenn er sie kennt.