没有得到重载(只使用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.
但是当Get过载时会产生
[dcc64 Error] E2250 There is no overloaded
version of ‘Get’ that can be called with these arguments
为什么编译器无法解决此重载?
解决方法
这里的问题是你正在使用的动态数组构造函数正在生成一个类型为TxALNameValuePair的数组的对象,但是所有的重载都要求类型为TxALNameValueArray,并且似乎编译器没有在TxALNameValuePair =的数组之间建立连接=>在tarray< T>对于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.
就像这样:
program Project1; {$APPTYPE CONSOLE} uses Types; procedure A(i : integer; da : TDoubleDynArray); overload; begin end; procedure A(s : string; da : TDoubleDynArray); overload; begin end; begin A(1,[1.0]); end.
也许我们想把它称为编译器错误?我不确定.正常类型分辨率向前工作,但是在重载分辨率下它必须向后工作……这可能是一般情况下的暂停问题情况.如果您对此感到强烈,可以提交QP.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。