Delphi XE многопользовательский вопрос пространства имен

Я читаю RAD Studio Documentaion в Delphi XE. вот несколько текстов.

[Справочник по Delphi → Руководство по языку Delphi → Программы и юниты → Использование пространств имен → Поиск пространств имен → Многомерные пространства имен]

Многопользовательские пространства имен

Несколько единиц могут принадлежать к одному и тому же пространству имен, если объявления единиц относятся к одному и тому же пространству имен.     Например, можно создать два файла: unit1.pas и unit2.pas со следующими объявлениями блока:

// in file 'unit1.pas' 
unit MyCompany.ProjectX.ProgramY.Unit1 

// in file 'unit2.pas' 
unit MyCompany.ProjectX.ProgramY.Unit2 

В этом примере пространство имен MyCompany.ProjectX.ProgramY логически содержит все символы интерфейса из unit1.pas и unit2.pas.

Имена символов в пространстве имен должны быть уникальными для всех единиц пространства имен.
    В приведенном выше примере ошибка для Unit1 и Unit2 заключается в определении глобального символа интерфейса с именем mySymbol

Я протестировал это. кода ниже.

----------------------------------------------------------------- 
program Project1; 

{$APPTYPE CONSOLE} 

uses 
  SysUtils, 
  Lib.A in 'Lib.A.pas', 
  Lib.B in 'Lib.B.pas'; 

begin 
  WriteLn ( TestValue ) ; 
  ReadLn ; 
end. 
----------------------------------------------------------------- 
unit Lib.A; 

interface 
  const TestValue : Integer = 10 ; 
implementation 

end. 
----------------------------------------------------------------- 
unit Lib.B; 

interface 
  const TestValue : Integer = 10 ; 
implementation 

end. 

Это не ошибка. Зачем? Я не понимаю.

Ответ 1

Ваш код не соответствует документации. В документации явно указано, что имя файла "unit MyCompany.ProjectX.ProgramY.Unit1" - unit1.pas, а не MyCompany.ProjectX.ProgramY.Unit1.

Однако я не верю, что эта функция реализована вообще. Если я изменю свой код для хранения первого блока в файле a.pas и второго блока в файле b.pas, блоки вообще не компилируются, а ошибка

[DCC Error] A.pas(1): E1038 Unit identifier 'Lib.A' does not match file name

(Это точно так, как я ожидал увидеть.)

В вашем случае нет конфликта, потому что вы всегда можете использовать полное имя "конфликтующее" глобальное - Lib.A.TestValue и Lib.B.TestValue.

Ответ 2

В Delphi.NET(до Prism): unit name = namespace. То, как они использовали это в то время - и в dotNET единица была действительно пространством имен (включительно как таковое в сгенерированном ИЛ).

В родном Delphi я не вижу разницы (если это вообще существует).