Maaa, es wäre jetzt zu einfach gewesen.
Delphi-Quellcode:
type
TWindowsSet<T> = record
class operator Implicit(A: T): TWindowsSet<T>;
case Integer of
0: (TheSet: T);
1: (Aligned: Integer);
end;
Aber neeeeeeeeee.
Code:
type
TMyEnum = (one, two);
TMySet = set of TMyEnum;
TMyRecord = record
Field: Integer;
end;
TMyManagedRec = record
Field: string;
end;
TMyRecordCon = record
//constructor Create; // [dcc32 Fehler] E2394 Parameterlose Konstruktoren sind für Record-Typen nicht zulässig
constructor Create(i: Integer);
end;
TMyClass = class
constructor Create;
end;
TMyProcedure = procedure;
TMyMethod = procedure of object;
TMyReference = reference to procedure;
TWithConstructor<T: constructor> = record
end;
TWithClass<T: class> = record
end;
TWithRecord<T: record> = record
end;
//TTheRecord = TWithConstructor<TMyRecord>; // [dcc32 Fehler] E2513 Typparameter 'T' muss parameterlosen Konstruktor haben
//TTheRecord2 = TWithConstructor<TMyRecordCon>; // [dcc32 Fehler] E2513 Typparameter 'T' muss parameterlosen Konstruktor haben
TTheConClass = TWithConstructor<TObject>; // äähhhhhm, eigentlich hat TMyRecordC Einen, sber mit Klassen geht es
TTheClass = TWithClass<TObject>; // class = constructor, aber hier wenigstens eindeutg
TTheRecord = TWithRecord<TMyRecord>; // jupp
TTheManaged = TWithRecord<TMyManagedRec>; // jupp
//TTheSet = TWithRecord<TMySet>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein
TTheEnum = TWithRecord<TMyEnum>; //
TTheBoolean = TWithRecord<Boolean>; //
TTheInteger = TWithRecord<Integer>; //
//TTheStatic = TWithRecord<IntegerArray>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : ein Integer geht, aber Viele nicht?
//TThePointer = TWithRecord<Pointer>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : Pointer und Integer sind doch das "Gleiche" ?
//TTheShort = TWithRecord<ShortString>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : ein Record, bzw. statisches Array und ist doch das Gleiche, wie ein ShortString
//TTheString = TWithRecord<String>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : OK, das ist ein Managed-Type
//TTheArray = TWithRecord<TBytes>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : OK, Managed wie beim String
//TTheProc = TWithRecord<TMyProcedure>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : eigentlich wie ein Pointer/Integer
//TTheMethod = TWithRecord<TMyMethod>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : wie ein Pointer, außer wenn ARC aktiv (eventuell managed)
//TTheRef = TWithRecord<TMyReference>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein : das ist ein Interface (immer managed)
{
TWindowsSet<T> = record
class operator Implicit(A: T): TWindowsSet<T>;
case Integer of
0: (TheSet: T); // [dcc32 Fehler] E2569 Typparameter 'T' benötigt evtl. Finalisierung - im varianten Record nicht zulässig. Verwenden Sie die RECORD-Einschränkung
1: (Aligned: Integer);
end;
}
TWindowsSet<T: record> = record
class operator Implicit(A: T): TWindowsSet<T>;
case Integer of
0: (TheSet: T);
1: (Aligned: Integer);
end;
TEnum4 = TWindowsSet<TEnum>; // kompiliert, aber ist eigentlich falsch
//TSet4 = TWindowsSet<TSet>; // [dcc32 Fehler] E2512 Typparameter 'T' muss ein nicht-nullable Wertetyp sein
//TWindowsEnumSet<T:ordinal> = record // [dcc32 Fehler] Unit2.pas(47): E2003 Undeklarierter Bezeichner: 'ordinal'
TWindowsEnumSet<T: record> = record
type TSet = set of T; // [dcc32 Fehler] E2001 Ordinaltyp erforderlich
class operator Implicit(A: set of T): TWindowsEnumSet<T>; // [dcc32 Fehler] E2029 Bezeichner erwartet, aber 'SET' gefunden
class operator Implicit(A: TSet): TWindowsEnumSet<T>; // geht nicht, da das TSet fehlt
case Integer of
0: (TheSet: TSet);
1: (Aligned: Integer);
end;
https://docwiki.embarcadero.com/RADS...isierte_Typen)
Code:
<T> keine Einschränkung
<T, T2> keine Einschränkung
<T: IInterface; T2> Interace welches Dieses implementieren muß
<T: IInterface,IIntf,...; T2> Interace welches Diese implementieren muß
<T: TObject; T2> Klasse oder Nachfahr
<T: constructor; T2> muß einen Konstrutor enthalten, also Klassen (keine Records, obwohl Die auch Einen haben können)
<T: class; T2> nur Klassen
<T: record; T2> nur records und "einfache" Typen
also im Prinzip fehlt ja Vieles
"ordinal", wo wirklich nur ordinale Typen rein passen
"simple" für einfache Typen (keine Records, inkl. noneManaged)
"noneManaged", wo keine LongStrings, Variants, Interfaces und dynamische Arrays rein dürfen, sowie keine CustomManagedRecords und ARC, und ebenso keine Records/StaticArrays, wo sowas drin ist
"array", nja, halt bloß Arrays
"array,managed", bloß dynamische Arrays
"array,noneManaged", bloß statische Arrays
"array,****" ... ähhhh ja, statische Arrays, welche aber Managed-Zeugs enthalten dürfen?
OK, dann halt "array", "staticArray" und "dynamicArray" (mit anderem kombinierbar, für die Felder)