Pascal 中记录的横向隐式/显式类型转换

crosswise implicit / explicit type conversation of records in pascal

我想在pascal 中实现两种记录类型的横向类型对话。但我收到错误“错误:预期过程或函数”。这是相关代码:

{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
  Classes, SysUtils;

type
  TRGBA8 = packed record
    r,
    g,
    b,
    a: byte;
    public
      constructor Create(r_in, g_in, b_in, a_in: byte);
  end;

  TRGBA16 = packed record
    r,
    g,
    b,
    a: word;
    public
      constructor Create(r_in, g_in, b_in, a_in: word);
      class operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
      class operator :=(const c_in: TRGBA16): TRGBA8; inline;
  end;

  TRGBA8Helper = record helper for TRGBA8
    public
      class operator Explicit(const c_in: TRGBA8): TRGBA16;
  end;

我在声明 TRGBA8Helper 的 Operator Explicit 时收到错误。如何存档横向类型的对话。提前致谢。

我正在使用 Ubuntu 存储库中的 Lazarus 1.8.2 和 FPC 3.0.4。

我找到了解决办法。我的第一次尝试来源于FPC源码的TPoint class (/usr/share/fpcsrc/3.0.4/rtl/objpas/types.pp)。在 wiki.freepascal.org/Operator_overloading 中可以找到文档的 link:https://www.freepascal.org/docs-html/ref/refch15.html。此页面包含示例。所以我想到了这个解决方案:

{$mode objfpc}{$H+}
interface
{$modeswitch advancedrecords}
uses
  Classes, SysUtils;

type
  TRGBA8 = packed record
    r,
    g,
    b,
    a: byte;
    public
      constructor Create(r_in, g_in, b_in, a_in: byte);
  end;

  TRGBA16 = packed record
    r,
    g,
    b,
    a: word;
    public
      constructor Create(r_in, g_in, b_in, a_in: word);
  end;

operator Explicit(const c_in: TRGBA16): TRGBA8; inline;
operator :=(const c_in: TRGBA16): TRGBA8; inline;
operator Explicit(const c_in: TRGBA8): TRGBA16; inline;
operator :=(const c_in: TRGBA8): TRGBA16; inline;

因此不需要辅助记录,也不会发生错误。