E2506接口部分中声明的参数化类型的方法不得使用本地符号

时间:2011-10-26 06:16:38

标签: delphi generics compiler-errors delphi-2009

有人可以向我解释原因在创建泛型类时我必须将我的私有constans移动到接口部分吗?这是在扼杀我的设计,我不希望别人看到应该是私密的东西。

unit Unit38;

interface

uses
  Generics.Collections;

type
  TSimpleClass<T> = class(TObject)
  private
    procedure DoSomethingInternal(const SomeString: string);
  public
    procedure DoSomething;
  end;

implementation

const
  MyString = 'some string'; //Why this must be public?

{ TSimpleClass<T> }

procedure TSimpleClass<T>.DoSomething;
begin
  DoSomethingInternal(MyString); //Compiler error
end;

procedure TSimpleClass<T>.DoSomethingInternal(const SomeString: string);
begin
  //-------
end;

end.

感谢。

3 个答案:

答案 0 :(得分:5)

D2010中的错误相同,因此D2010的泛型修复程序没有解决这个问题。这是一个错误:http://qc.embarcadero.com/wc/qcmain.aspx?d=79747

已在构建15.0.3863.33207中修复。我认为是XE

另一个QC是:http://qc.embarcadero.com/wc/qcmain.aspx?d=78022涉及枚举但仍处于打开状态。

顺便提一下,关于错误的文档并不是很清楚。参见:

E2506 Method of parameterized type declared in interface section must not use local symbol '%s'

它涉及泛型类中的类var,不能在类的构造函数中赋予文字(!)值,修复是参数化构造函数...不知道为什么,但我猜它与编译器限制。

答案 1 :(得分:3)

这是Delphi中泛型实现的结果。当您通过在另一个单元中提供具体T来实例化类时,具体类的代码将写入该另一个单元。但是其他单位再也看不到你的私有字符串不变了。这令人沮丧。

我对泛型实现的理解表明,Mikael的解决方法将解决问题,因为当您在另一个单元中实例化具体类型时,类const将是可见的。

答案 2 :(得分:3)

不是答案,但可能的解决方法可能是在类声明中使用私有const。

TSimpleClass<T> = class(TObject)
private
    procedure DoSomethingInternal(const SomeString: string);
    const MyString = 'some string'; //Why this must be public?
public
    procedure DoSomething;
end;

这适用于Delphi 2010,XE和XE2,而不适用于Delphi 2009。