E2506 Метод параметризованного типа, объявленный в разделе интерфейса, не должен использовать локальный символ - PullRequest
10 голосов
/ 26 октября 2011

Может ли кто-нибудь объяснить мне В чем причина , что при создании универсального класса я должен переместить свои частные константы в раздел интерфейса? Это убивает мой дизайн, я не хочу, чтобы другие видели что-то частное.

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 ]

5 голосов
/ 26 октября 2011

Та же ошибка в D2010, поэтому исправления общего вида D2010 не решали эту проблему. Это ошибка: http://qc.embarcadero.com/wc/qcmain.aspx?d=79747

Исправлено в сборке 15.0.3863.33207. Который я считаю XE

Другой КК по этому вопросу: http://qc.embarcadero.com/wc/qcmain.aspx?d=78022, который включает в себя перечисление и все еще открыт.

Кстати, документация об ошибке не очень понятна. См:

E2506 Метод параметризованного типа, объявленный в разделе интерфейса, не должен использовать локальный символ "% s"

Он включает в себя класс var в универсальном классе, которому нельзя присвоить буквальное (!) Значение в конструкторе класса, исправление заключается в параметризации конструктора ... Не знаю почему, но я предполагаю, что это связано с ограничение компилятора.

3 голосов
/ 26 октября 2011

Не ответ, но возможный обходной путь может заключаться в использовании private 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.

3 голосов
/ 26 октября 2011

Это следствие реализации обобщений в Delphi.Когда вы создаете экземпляр класса, предоставляя конкретный T в другом модуле, код для конкретного класса записывается в этот другой модуль.Но этот другой модуль больше не может видеть вашу личную строковую константу.Это довольно разочаровывает.

Мое понимание реализации обобщений предполагает, что обходной путь Микаэля решит проблему, потому что класс const будет виден, когда вы создадите конкретный тип в другом модуле.

...