嵌套通用记录

时间:2018-04-18 08:17:12

标签: delphi generics delphi-10.1-berlin delphi-10.2-tokyo

我在尝试定义嵌套通用记录时遇到了一个奇怪的编译器错误。

嵌套适用于类和接口,但不能以某种方式记录。

type
  TRec<T> = record
    Value: T;
  end;

  TCls = class
  public
    Rec: TRec<TRec<Integer>>;
  end;

这不是在 Delphi Berlin 10.1.2 上编译的,而且在 Tokyo 10.2.3 上也没有运气。这是语言或编译器问题的限制吗?

错误消息是:

  

[dcc32错误] Project1.dpr(22):E2564未定义类型'TRec&lt; T&gt;'

我只想要一次嵌套Spring.Nullable<>类型,但这不起作用。之后我用一个简单的通用记录快速复制了它。

1 个答案:

答案 0 :(得分:9)

这是编译器错误,您应该提交错误报告。请考虑以下事项:

type
  TRec<T> = record
    Value: T;
  end;

var
  Rec: TRec<TRec<Integer>>; // compiles successfully
  RecArray: TArray<TRec<TRec<Integer>>>; // compiles successfully

procedure foo;
var
  Rec: TRec<TRec<Integer>>; // compiles successfully
begin
end;

type
  TContainingClass = class
    Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
  end;

  TContainingRecord = record
    Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
  end;

  TContainingObject = object
    Rec: TRec<TRec<Integer>>; // E2564 Undefined type 'TRec<T>'
  end;

在聚合化合物类型中使用类型时,似乎会出现缺陷。

它有些蹩脚,但这是我能找到的唯一解决办法:

type
  TRec<T> = record
    Value: T;
  end;

  TRecRec<T> = record
    Value: TRec<T>;
  end;

  TContainingClass = class
    Rec: TRecRec<Integer>;
  end;

但在任何现实世界的情况下,这都不会有用。