【问题标题】:How do I fully qualify type identifiers in generic methods in Delphi?如何在 Delphi 的泛型方法中完全限定类型标识符?
【发布时间】:2010-11-19 05:32:57
【问题描述】:

尝试在 Indy IdUDPServer 组件上分配 OnUDPRead 事件时出现此问题。 (DelphiXE 更新 1)

以下自动生成的代码给出了语法错误“预期为 '>' 但 '.'找到”:

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TArray<System.Byte>; ABinding: TIdSocketHandle);

我可以通过将声明更改为:

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TArray<Byte>; ABinding: TIdSocketHandle);

为了将来参考,我如何完全限定泛型方法中的类型标识符?

【问题讨论】:

    标签: delphi generics indy10


    【解决方案1】:

    (尚)不支持完全限定的类型标识符。但是您可以使用类型别名来规避这种情况:

    type
      TMyByte = System.Byte;
    
    procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      AData: TArray<TMyByte>; ABinding: TIdSocketHandle);
    

    【讨论】:

    • 谢谢。我应该想到这一点,我只是希望有一种直接的方法来限定参考。我会查看 Quality Central,看看是否有要投票的错误报告。
    • 只有在 Embarcadero 最终阻止 Delphi 将 typedef 解析为其基本类型之前,才需要使用这样的手动 typedef。 OnUDPRead 事件在技术上讲 TIdBytes 作为参数,但到目前为止,每个版本的 Delphi 都直接将其解析为 DynamicArray 或 TArray,这非常烦人并导致这类问题。
    • @Remy Lebeau - 啊,所以生成的代码不是IdUDPServer代码中指定的,而是IDE生成的?我从来没有意识到这一点。
    • @HMcG:每当您双击 Object Inspector 中的事件时,IDE 都会读取组件的 RTTI,确定事件的签名,解析参数和返回值类型,并生成相应的代码为他们。除了声明事件类型之外,组件本身根本不参与该过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多