type My = class public _a: T; procedure Deconstruct(var a: T); begin a := _a; end; end; procedure Deconstruct(self: My; var a: T); extensionmethod; begin Assert(false); a := self._a; end; procedure Deconstruct(self: My; var a: object); extensionmethod; begin a := self._a; end; procedure Deconstruct(self: My; var a: object; var b: object); extensionmethod; begin Assert(false); a := self._a; end; begin var l := new My>; l._a := Arr(1, 2, 3).ToList; match l with My(a: real): Assert(false); My(a: integer): Assert(false); My>(a: object): ; else Assert(false); end; end.