E2037' ReadBytes'与以前的声明不同

时间:2017-10-02 10:58:18

标签: delphi

错误的部分代码:

 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中它编译了!

我不理解的错误是什么?

1 个答案:

答案 0 :(得分:2)

这只是一个有根据的猜测,因为提供的代码很稀疏。提供的代码提供的小提示:

    声明后包含的代码示例中提供的
  • uses System.SysUtils,定义TBytes的单位
  • 提供的用途是在声明之后,因此必须TBytes 源代码不同于System.SysUtils

因此,TBytes实际上可能并未在声明和实现部分中引用相同的类型。这可以通过将鼠标悬停在类型上来可视化。工具提示将告诉您编译器所指的确切类型。

我可以用两个小单元重现你的问题。 TBytesSystem.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 Bytetype 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; 我已经改变了我的代码示例并重新考虑了部分答案。