【问题标题】:What does delphi compiler error E2134 mean?delphi编译器错误E2134是什么意思?
【发布时间】:2010-08-11 13:00:55
【问题描述】:

在我正在修复的一些代码中,大量使用泛型和接口类型,我收到错误

 E2134,类型“”没有类型信息。

我相信这是因为我正在进行重构,其中一些全部使用泛型的深度嵌套的单元集不同步,但错误并没有发生在我可以使用错误消息的地方在出现错误的位置修复代码,因为代码没有任何问题。

这里是上下文,模拟出来的,因为我不能贴代码,太多了:

 unit GenericThing;
 ...
 interface
 ...
 type
 ...
 IThingListOf<ThingT> = interface( IThingContainer )
    function  getEnumerator: TEnumerator<ThingT>;
    function  getCount: Integer;
    function  getThing( Index: integer ): ThingT;
    function  getFirst: ThingT;
      function  IndexOf( value: ThingT): integer;
    function  addItem( const Thing: ThingT ): ThingT;
      function  removeItem( const Thing: ThingT ): Integer;
    procedure clear;
    procedure Sort; overload;
    procedure Sort(const AComparer: IComparer<ThingT>); overload;
    property  Count: integer read getCount;
    property  First: ThingT read getFirst;
    property  Items[Index: integer]: ThingT read getThing; default;
  end;

 // error appears on whatever line number comes after the declaration of  IThingListOf<ThingT>...end; 
  function AnythingYouLikeHere:Integer; // there is nothign wrong with this line, but you get the E2134 here.

看来问题出在 IThingContainer 本身:

   IThingContainer = interface ...
       ...
       procedure DoSomething(const Param);
   end;

上面的“const Param”没有类型信息。在我看来,这是 Pascal/Delphi 的一个奇怪的(腋窝),你完全违反了 Wirth 的强类型概念。它与 C 中的“void *”指针或 Delphi 中的“Pointer”类型一样弱类型,但它很少使用,除了在诸如 Move 等标准的 pre-object-pascal RTL 函数之类的地方之外在。在我看来,在泛型中使用的接口中的无类型参数应该被允许或禁止,但有时不允许,有时不允许。

这是一个 1978 年的 Pascal 特征与 2009 年的 ObjectPascal 特征严重混合的例子。

【问题讨论】:

    标签: delphi generics delphi-2010 compiler-errors


    【解决方案1】:

    错误消息表示给定类型没有可用的类型信息。

    这是一个生成消息的最小程序:

    type
      {$M+}
      IThing = interface
        procedure P(const X);
      end;
      {$M-}
    begin
    end.
    

    问题似乎在于IThingListOf&lt;&gt; 或其祖先之一是在{$M+} 活动的情况下编译的。编译器由此推测您真的想要接口的完整类型信息;最初它被 SOAP 等支持用于生成存根等。接口 RTTI 不支持无类型参数(从逻辑上讲,它们不能被 SOAP 等编组) - 它们显示为 void 类型,并且您最终会收到此错误消息。

    解决方案是要么不使用{$M+} - 尽管可能正在使用 RTTI,否则它不会被启用 - 或者使用例如Pointer 而是明确地传递地址。

    【讨论】:

      【解决方案2】:

      这很难说,尤其是在没有可用的 IThingContainer 定义的情况下。如果您将接口定义注释掉,它会编译过去吗?显然,当您尝试创建一个实现该接口的类时它会中断,但是将其注释掉是否可以解决 this 问题?

      如果是这样,那么编译器在接口定义中的某些东西会窒息。尝试注释掉其中的一部分以找出问题所在。如果没有,那么您将不得不寻找其他地方。

      【讨论】:

      • 只有当 IThingContainer 定义了在函数中包含无类型参数的接口方法时才会发生这种情况。真正奇怪的是,有时您可以在函数中定义无类型参数,而有时您不能。我正在查看一个大量使用无类型参数的代码库。更改 IThingContainer 中要输入的所有参数可以解决问题,但我找不到发生这种情况的原因。
      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2012-08-04
      • 2014-06-24
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多