没有<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”版本
为什么编译器无法解决此重载?
答案 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。