function operator implicit(f: System.Func): System.Action; extensionmethod; begin Result := procedure()->f(); end; function operator implicit(f: System.Func): System.Func; extensionmethod; begin Result := ()->f(default(T)); end; function operator implicit(f: System.Action): System.Func; extensionmethod; begin Result := ()->begin f(); Result := default(T) end; end; var i: integer; function ff(): integer; begin i := 2; end; function ff2(j: integer): integer; begin i := 3; end; begin var fff: System.Func := ff; var a: System.Action := fff; a; assert(i=2); fff := a; assert(fff() = 0); var fff2: System.Func := ff2; fff := fff2; fff(); assert(i=3); end.