最近我发现了一些奇怪的(对我而言)Delphi代码,我把它分离到一个单独的小项目中。这是我发现的。 Unit1编译时没有错误。 Unit2(我提供用于比较)没有。不同之处在于类是used
。
unit Unit1;
interface
uses Classes; // difference here
type TThread = class(Classes.TThread)
public
property Terminated;
end;
implementation
end.
Unit2无法编译。产生了各种错误。
unit Unit2;
interface
uses System.Classes; // difference here
type TThread = class(Classes.TThread)
public
property Terminated;
end;
implementation
end.
[dcc32 Error] Unit1.pas(7): E2003 Undeclared identifier: 'Classes'
[dcc32 Error] Unit1.pas(7): E2029 ',' or ':' expected but ')' found
[dcc32 Error] Unit1.pas(9): E2147 Property 'Terminated' does not exist in base class
所以我担心的是这个项目正在利用编译器错误来实现它的目标 。编译器错误可能会在以后的版本中修复,然后代码将不再起作用。
答案 0 :(得分:10)
没有使Unit1编译的编译器错误。它编译是因为在项目设置中,单位范围名称的条目至少包含项目系统,用于解析全名中的 Classes 的引用System.Classes 。由于用途包含 Classes ,因此对 Classes.TThread 的引用也会成功。
在Unit2中,用途包含 System.Classes 。因此,无法再解析引用 Classes.TThread 。将其更改为 System.Classes.TThread ,它可以正常工作。
答案 1 :(得分:9)
如果使用System.Classes,则在引用代码中的classes单元时也必须使用System.Classes,如下所示。
unit Unit2;
interface
uses System.Classes; // difference here
type TThread = class(System.Classes.TThread)
public
property Terminated;
end;
implementation
end.