uses System.Collections.Generic; type TRec = record a: integer; end; type TClass = class lst: List; constructor(params arr: array of T); begin lst := new List; foreach item: T in arr do lst.Add(item); end; procedure Check(params arr: array of T); begin var i := 0; foreach item: T in lst do begin assert(item = arr[i]); i += 1; end; end; end; type TClass2 = class where T: IEnumerable; lst: T; procedure Check(params arr: array of U); begin var i := 0; foreach item: U in lst do begin assert(item = arr[i]); i += 1; end; end; end; begin var lst: List := new List; var rec: TRec; rec.a := 23; lst.Add(rec); lst.Add(rec); foreach r: TRec in lst do assert(r.a = 23); var lst2: List := new List(); lst2.Add(35); lst2.Add(35); foreach i: integer in lst2 do assert(i = 35); foreach i: integer in new integer[3](23,23,23) do assert(i = 23); var obj: TClass := new TClass(1,2,3,4,5); obj.Check(1,2,3,4,5); var obj2: TClass := new TClass(1,2,3,4,5); obj2.Check(1,2,3,4,5); var obj3: TClass> := new TClass>(obj,obj2); obj3.Check(obj, obj2); var arlst := new System.Collections.ArrayList(); arlst.Add(23); arlst.Add(23); foreach i: integer in arlst do assert(i = 23); var obj4: TClass2,integer> := new TClass2,integer>; obj4.lst := lst2; obj4.Check(35,35); end.