lok*_*oki 4 delphi delphi-10.2-tokyo
没有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.
但是当Get它超载时会产生
[dcc64错误] E2250没有可以使用这些参数调用的'Get'的重载版本
为什么编译器无法解决此重载?
这里的问题是,您使用的是动态数组构造是生产类型的对象array of TxALNameValuePair,但所有的重载的需要类型是TxALNameValueArray,它似乎是编译器不做之间的连接array of 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.
| 归档时间: | 
 | 
| 查看次数: | 252 次 | 
| 最近记录: |