delphi – 为什么编译器找不到我的函数的重载版本?
没有得到重载(只使用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过载时会产生
为什么编译器无法解决此重载? 解决方法
这里的问题是你正在使用的动态数组构造函数正在生成一个类型为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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |