最近我发现了一些奇怪的(对我而言)Delphi代码,我把它分离到一个单独的小项目中.这是我发现的.Unit1编译没有错误.Unit2(我提供用于比较)没有.区别在于Classes的方式used.
unit Unit1;
interface
uses Classes; // difference here
type TThread = class(Classes.TThread)
public
property Terminated;
end;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以我担心的是这个项目正在利用编译器错误来实现它的目标.编译器错误可能会在以后的版本中修复,然后代码将不再起作用.
Uwe*_*abe 10
没有使Unit1编译的编译器错误.它编译是因为在项目设置中,单元范围名称的条目至少包含项目System,该项目用于解析对全名System.Classes中的类的引用.由于用法包含Classes,因此对Classes.TThread的引用也会成功.
在Unit2中,用途包含System.Classes.因此无法再解析引用Classes.TThread.将它更改为System.Classes.TThread并且它可以工作.
如果使用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.
Run Code Online (Sandbox Code Playgroud)