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

Delphi E2037'的声明;ReadBytes';与以前的声明不同,delphi,Delphi,错误所在代码的一部分: function ReadBytes(maxLen: integer): TBytes; virtual; ... uses sysutils, windows, SysConst, commutil; ... function TBasicBufferedStream.ReadBytes(maxLen: Integer): TBytes; begin if maxLen > 0 then begin

错误所在代码的一部分:

 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;
函数ReadBytes(maxLen:integer):TBytes;事实上的
...
使用sysutils、windows、SysConst、convertil;
...
函数TBasicBufferedStream.ReadBytes(maxLen:Integer):TBytes;
开始
如果maxLen>0,则
开始

如果maxLen这只是一个有根据的猜测,因为提供的代码是稀疏的。提供的代码给出了以下小提示:

  • 使用声明包含后的代码示例中提供的
    System.SysUtils
    ,定义
    t字节的单位
  • 提供的用途在声明之后,因此必须有
    t字节
    具有与System.SysUtils不同的源代码
因此,在声明和实现部分,
TBytes
很可能实际上并不是指同一类型。这可以通过将鼠标悬停在类型上来可视化。工具提示将告诉您编译器引用的确切类型

例如,我可以用两个小单位再现你的问题
TBytes
是在
System.SysUtils
中声明的,但我声明了另一个,就像在
Unit3
中的Delphi 2009(见下文)中定义的一样:

unit Unit3;

interface

type
  TBytes = array of Byte;

implementation

end.
当我现在创建一个如下所示的单元时,我混淆了来自两个不同单元的tbyte的用法,这两个单元不兼容:

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:Byte数组
type System.SysUtils.TBytes:System.array

因此,事实上,声明中我的函数的签名与实现中的签名不同

这可以通过以下方式解决:

  • 检查使用的装置是否正确和必要,可以吗 摆脱引起歧义的那个
  • 如果不可能用第一点来解决它,那么它是可能的 通过在前面加上前缀来显式地引用哪种类型 包含单位:

      function ReadBytes(maxLen: integer): Unit3.TBytes;
    
我追溯查看了
System.SysUtils.TBytes的历史,在Delphi 7中找不到它,但在Delphi 2009中,TBytes的定义如下:

考虑到这一点,我修改了我的代码示例,并重新表述了部分答案

你能显示错误信息吗compilation@MosabShaheen:[dcc32错误]bufstream.pas(261):E2037对“ReadBytes”的声明与以前的声明不同。错误说明了这一点。检查readBytes的声明,是否添加了内容,是否忘记了重载,是否覆盖?也许可以演示如何声明函数本身。此外,不同版本的delphi可能会有很大的不同。代码的第一行在什么上下文中?单元,类?你需要向我们展示真实的代码-重现你的问题的东西。我们不知道这里的背景,所以答案可能是很多。显示的答案是似是而非的猜测,但我们不需要猜测以使用定义的type@NasreddineAbdelillahGalfout这基本上是检查所使用的单位是否正确和必要,你能消除造成歧义的单位吗?它在D7上工作,所以我猜这种情况是不可能的(我不确定TBytes是否是D7中System.SysUtils的一部分)@NasreddineAbdelillahGalfout泛型是在2009年引入的,当前TBytes的定义(至少回到XE2)是使用泛型。Delphi7至少没有使用相同的TBytes