使用Delphi 10编译SelectDirectory第三次重载

Bil*_*ill 2 delphi delphi-10-seattle

为什么不编译?看起来很简单,但我不明白......是字符串数组的问题?错误是:

[dcc32 Error] Unit1.pas(94): E2250 There is no overloaded version of 'SelectDirectory' that can be called with these arguments. 
Run Code Online (Sandbox Code Playgroud)

这是代码:

{
function SelectDirectory(const StartDirectory: string; out Directories: TArray<string>; Options: TSelectDirFileDlgOpts = [];
  const Title: string = ''; const FolderNameLabel: string = ''; const OkButtonLabel: string = ''): Boolean; overload;
}

procedure TForm2.Browse1Click(Sender: TObject);
var
  iStartFolder: string;
  iDirectories: Array of string;
  iSelectedFolder: string;
begin
  iStartFolder := DesktopFolder;
  if SelectDirectory(iStartFolder, iDirectories,
    [sdHidePinnedPlaces, sdNoDereferenceLinks, sdForceShowHidden,
    sdAllowMultiselect], 'Select Folder', 'Folder', 'Ok') then
    ShowMessage(iDirectories[0]);
end;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 7

第三个SelectDirectory()重载的第二个参数是out参数,因此您必须提供与参数类型相同的变量.您正在尝试传递array of string变量所在的System.TArray<String>变量,从而传递错误.请改用:

procedure TForm2.Browse1Click(Sender: TObject);
var
  iStartFolder: string;
  iDirectories: TArray<string>;
  iSelectedFolder: string;
begin
  iStartFolder := DesktopFolder;
  if SelectDirectory(iStartFolder, iDirectories,
    [sdHidePinnedPlaces, sdNoDereferenceLinks, sdForceShowHidden,
    sdAllowMultiselect], 'Select Folder', 'Folder', 'Ok') then
    ShowMessage(iDirectories[0]);
end;
Run Code Online (Sandbox Code Playgroud)

虽然TArray<String>它只是一个别名array of string,但与out参数一起使用时,它们实际上是不同的类型.

  • @KenWhite:`TArray <String>`只是`String of String`的别名:`type TArray <T> = T的数组;`.但是,在这种情况下,涉及"out"参数时,它们会被视为不同. (2认同)