function myfirst(self:array of T): T; extensionmethod; begin Result := self[0]; end; function abs(self: integer): integer; extensionmethod; begin Result := PABCSystem.Abs(self); end; function test(self: List): integer; extensionmethod; begin Result := self[1]; end; function test(self: List): real; extensionmethod; begin Result := self[0]; end; procedure myproc(self: integer); extensionmethod; begin assert(self = 2); end; function glue(self: array of char): string; extensionmethod; begin var sb: StringBuilder := new StringBuilder(); foreach var c in self do sb.Append(c); Result := sb.ToString(); end; procedure MyAdd(self: List; params arr: array of T); extensionmethod; begin self.AddRange(arr); end; procedure Add(self: List; params arr: array of integer); extensionmethod; begin self.AddRange(arr); end; function BinarySearch(self: array of T; item: T): integer; extensionmethod; begin Result := System.Array.BinarySearch(self,item); end; procedure Test1(self: array[,] of T); extensionmethod; begin assert(self[0,0].ToString() = '3'); var e := self[0,0]; assert(e.ToString='3'); end; begin var arr := Arr(1,2,3); assert(arr.myfirst=1); var i := -2; assert(i.abs = 2); var lst: List := new System.Collections.Generic.List(); lst.Add(20);lst.Add(15); assert(lst.test() = 15); var lst2: List := new System.Collections.Generic.List(); lst2.Add(20);lst2.Add(15); assert(lst2.test() = 20); var j:= 2; j.myproc; assert(PABCSystem.Arr('a','b','c').glue='abc'); var lst3 := new List; lst3.MyAdd(2,3,4,5); assert(lst3[3]=5); var lst4 := new List; lst4.Add(2,3,4,5); assert(lst4[3]=5); assert(arr.BinarySearch(3)=2); var arr3 := new integer[2,2]; arr3[0,0] := 3; arr3.Test1; end.