kann es sein das die Angabe von constructor deswegen nicht mehr reicht, weil jetzt auch Records Konstruktoren haben dürfen?
Nein, der constructor Constraint besagt, dass der Typ einen parameterlosen Konstruktor haben muss und das können Records sowieso nicht.
Dass es nicht mehr kompiliert liegt an der Änderung von
FreeAndNil
, was nun nicht mehr einen typenlosen var Parameter entgegen nimmt.
Semantisch hast du schon vorher sichergestellt, dass T nur eine Klasse sein kann, aber nicht syntaktisch, weswegen der Compiler das nun nicht mehr akzeptiert hat.
Um noch ein bisschen auszuholen, warum der constructor Contraint nicht class beinhaltet: die Constraints bei Generics wurden seinerzeit aus .Net übernommen, als Delphi noch in diese Richtung Avancen hatte.
Dabei haben die Entwickler leider einige kleine Klinken eingebaut:
In C# bedeutet der class constraint, dass es sich um einen Referenztypen(!) handeln muss (ja, das sind dann auch interfaces). Wenn man dort nur Klassen haben will, dann muss man einfach Object (oder die entsprechende Basisklasse) angeben.
Diesem kleinen Unterschied ist es wohl auch geschuldet, dass man nicht
TObject
als constraint angeben kann und anstatt dessen einen E2510 bekommt und
constructor
alleine nicht
class
impliziert.
Siehe auch:
https://docs.microsoft.com/de-de/dot...ype-parameters