错误的部分代码:
function ReadBytes(maxLen: integer): TBytes; virtual;
...
uses sysutils, windows, SysConst, commutil;
...
function TBasicBufferedStream.ReadBytes(maxLen: Integer): TBytes;
begin
if maxLen > 0 then
begin
if maxLen <= (fBufFill - fInBufPos) then
begin
SetLength(result, maxLen);
Move(fBuf[fInBufPos], result[0], maxLen);
inc(fInBufPos, maxLen);
end
else
begin
result := Peek(maxLen);
Skip(maxLen);
end;
end
else
result := nil;
end;
在Delphi 10.2中它没有编译,在Delphi 7中它编译了!
我不理解的错误是什么?
答案 0 :(得分:2)
这只是一个有根据的猜测,因为提供的代码很稀疏。提供的代码提供的小提示:
uses
System.SysUtils
,定义TBytes
的单位TBytes
源代码不同于System.SysUtils
因此,TBytes
实际上可能并未在声明和实现部分中引用相同的类型。这可以通过将鼠标悬停在类型上来可视化。工具提示将告诉您编译器所指的确切类型。
我可以用两个小单元重现你的问题。 TBytes
在System.SysUtils
中声明,但我声明了另一个 - 就像在Unit3
中的Delphi 2009(见下文)中定义的那样:
unit Unit3;
interface
type
TBytes = array of Byte;
implementation
end.
当我现在创建一个像下面这样的单元时,我混淆了两个不兼容的TBytes的使用情况:
unit Unit2;
interface
uses
Unit3;
function ReadBytes(maxLen: integer): TBytes;
implementation
uses
System.SysUtils;
function ReadBytes(maxLen: integer): TBytes;
begin
//
end;
end.
工具提示将显示的类型为type Unit3.TBytes: array of Byte
和type System.SysUtils.TBytes: System.Array<System.Byte>
。
因此实际上我的函数在声明中的签名与实现中的签名不同。
这可以通过
来解决如果不能用第一点解决它,就有可能 通过加前缀来明确指出哪种类型 包含单位:
function ReadBytes(maxLen: integer): Unit3.TBytes;
我查看了System.SysUtils.TBytes
追溯的历史,找不到Delphi 7,但在Delphi 2009中,TBytes的定义如下:TBytes = array of Byte;
我已经改变了我的代码示例并重新考虑了部分答案。