为什么编译器找不到我的函数的重载版本?

时间:2018-03-01 17:10:55

标签: delphi delphi-10.2-tokyo

没有<HTML> <HEAD> <TITLE>Request Entity Too Large</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> <H1>Request Entity Too Large</H1> <H2>Error 413</H2> </BODY> </HTML> 被重载(仅使用Get的第一个定义),否则编译好了:

Get

但是当program Project1; {$APPTYPE CONSOLE} uses SysUtils, Classes; type TxALNameValuePair = record Name: ansistring; Value: ansistring; constructor Create(const AName, AValue: ansistring); end; TxALNameValueArray = TArray<TxALNameValuePair>; TxALHTTPClient = class(TObject) private protected public Function Get(const aUrl:AnsiString; const ARequestHeaderValues: TxALNameValueArray = nil): AnsiString; overload; Function Get(const aUrl:AnsiString; const aRequestFields: TStrings; const aEncodeRequestFields: Boolean=True; const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString; overload; end; constructor TxALNameValuePair.Create(const AName, AValue: ansiString); begin Name := AName; Value := AValue; end; function TxALHTTPClient.Get(const aUrl: AnsiString; const ARequestHeaderValues: TxALNameValueArray): AnsiString; begin end; Function TxALHTTPClient.Get(const aUrl:AnsiString; const aRequestFields: TStrings; Const aEncodeRequestFields: Boolean=True; const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString; begin end; var aHttpCLient: TxALHTTPClient; begin aHttpClient := TxALHTTPClient.Create; aHttpCLient.get('http://www.toto.com', [TxALNameValuePair.Create('Accept-Encoding', 'gzip')]); ReadLn; end. 重载时会产生

  

[dcc64错误] E2250没有重载   可以使用这些参数调用的“Get”版本

为什么编译器无法解决此重载?

1 个答案:

答案 0 :(得分:7)

这里的问题是您正在使用的动态数组构造函数正在生成类型为array of TxALNameValuePair的对象,但是所有重载都要求类型为TxALNameValueArray,并且编译器似乎是未在array of TxALNameValuePair ==&gt;之间建立联系TArray<T>的{​​{1}}。

当没有从重载引入歧义时,可以将数组隐式转换为正确的类型,但是否则您似乎必须以某种方式提供该类型信息。最简单(也可能是最清晰)的方法就是使用变量。

T => TAxTxALNameValuePair

您还可以使用类型化动态数组构造函数构建数组:

var
  aHttpCLient: TxALHTTPClient;
  nvpArray : TxALNameValueArray;
begin
  aHttpClient := TxALHTTPClient.Create;
  nvpArray := [TxALNameValuePair.Create('Accept-Encoding', 'gzip')];
  aHttpCLient.get('http://www.toto.com', nvpArray);
  ReadLn;
end.

否则,除非您对自己的名称 - 值对记录类型有特殊需求,否则您只能使用var aHttpCLient: TxALHTTPClient; begin aHttpClient := TxALHTTPClient.Create; aHttpCLient.get('http://www.toto.com', TxALNameValueArray.Create( TxALNameValuePair.Create('Accept-Encoding', 'gzip') )); ReadLn; end. 中提供的那个:

System.Net.URLClient

我猜测这只是因为编译器魔法,它是系统定义的类型。

在此路线的下方,您可以同样使用program Project1; {$APPTYPE CONSOLE} uses SysUtils, Classes, System.Net.URLClient; type TxALHTTPClient = class(TObject) private protected public Function Get(const aUrl:AnsiString; const ARequestHeaderValues: TNameValueArray = nil): AnsiString; overload; Function Get(const aUrl:AnsiString; const aRequestFields: TStrings; const aEncodeRequestFields: Boolean=True; const ARequestHeaderValues: TNameValueArray = nil): AnsiString; overload; end; function TxALHTTPClient.Get(const aUrl: AnsiString; const ARequestHeaderValues: TNameValueArray): AnsiString; begin end; Function TxALHTTPClient.Get(const aUrl:AnsiString; const aRequestFields: TStrings; Const aEncodeRequestFields: Boolean=True; const ARequestHeaderValues: TNameValueArray = nil): AnsiString; begin end; var aHttpCLient: TxALHTTPClient; begin aHttpClient := TxALHTTPClient.Create; aHttpCLient.get('http://www.toto.com', [TNameValuePair.Create('Accept-Encoding', 'gzip')]); ReadLn; end. 代替TNetHeaders,前者只是这种类型的别名。您也可以创建自己的别名,如

TNameValueArray

如果你真的想要。

深入挖掘,我们可以制作一个显示问题的最小例子:

TxALNameValueArray = TNetHeaders;

这不会编译出同样的错误。

这确实有效:

program Project1;
{$APPTYPE CONSOLE}

type
  TDblArray = TArray<double>;

procedure A(i : integer; da : TDblArray); overload;
begin
end;

procedure A(s : string; da : TDblArray); overload;
begin
end;

begin
  A(1, [1.0]);
end.

就像这样:

program Project1;
{$APPTYPE CONSOLE}

type
  TDblArray = array of double;

procedure A(i : integer; da : TDblArray); overload;
begin
end;

procedure A(s : string; da : TDblArray); overload;
begin
end;

begin
  A(1, [1.0]);
end.

也许我们想把它称为编译器错误?我不确定。正常类型分辨率向前工作,但是在重载分辨率下它必须向后工作......这可能是一般情况下的暂停问题情况。如果您对此感到强烈,可以提交QP。