我的项目中有一个generic class
,它有两个具有不同可见性的重载方法,如下所示:
private
可见度和一些参数。它使用参数和一些私有结构(其中一些在构造函数中注入)来执行一些操作。protected
可见性的无参数。派生类使用此类来执行超类实现的操作。为了做到这一点calls the private method
。这样可以正常工作,但编译器会发出一条提示消息,如下所示:
[dcc32提示] Project1.dpr(15):H2219私人符号' Bar'声明但从未使用
出于好奇,我试图重新创建课程,而不是一般课程。在这种情况下,编译器提示不会出现。
下面你可以找到一个简单的例子来证明这个案例:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
//class with generic type
TFoo<T> = class
private
procedure Bar(param : string); overload;
protected
procedure Bar; overload;
end;
//class without generic type
TFoo2 = class
private
procedure Bar(param : string); overload;
protected
procedure Bar; overload;
end;
//TFoo<T> methods
procedure TFoo<T>.Bar(param: string);
begin
writeln('Foo<T>. this is a private procedure. ' + param);
end;
procedure TFoo<T>.Bar;
begin
writeln('Foo<T>. This is a protected procedure.');
Bar('Foo<T>. calling from a protected one.');
end;
//TFoo2 methods
procedure TFoo2.Bar(param: string);
begin
writeln('Foo2. this is a private procedure. ' + param);
end;
procedure TFoo2.Bar;
begin
writeln('Foo2. This is a protected procedure.');
Bar('Foo2. calling from a protected one.');
end;
var
foo : TFoo<string>;
foo2 : TFoo2;
begin
try
foo := TFoo<string>.Create;
foo2 := TFoo2.Create;
try
foo.Bar;
foo2.Bar;
readln;
finally
foo.Free;
foo2.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
在此示例中,未使用泛型类型,但没有必要证明这一点。我的真正的类确实使用它,并且还会出现编译器提示。
为什么这个编译器提示出现在泛型类中的任何想法?我在Delphi XE5上进行了测试。
更新:因为它似乎是编译器错误,我们提交了QC report。
答案 0 :(得分:3)
这是编译器错误。您应该提交质量控制报告。
有趣的是,您的代码甚至不能在较旧的Delphi版本上编译。例如,我无法在XE3上编译您的代码。对Bar
的第一次调用失败了:
[dcc32错误]:E2250没有可以使用这些参数调用的“Bar”的重载版本
如果我记得这个问题与在.dpr文件中声明和实例化泛型类型有关。