【发布时间】:2011-09-10 23:57:54
【问题描述】:
以下简化的示例代码在尝试使用 as 运算符转换为泛型类型时会产生编译器错误。奇怪的是,is 运算符和硬转换的组合确实可以按预期工作。
program Project8;
{$APPTYPE CONSOLE}
uses
SysUtils, Controls, StdCtrls;
type
TControlWrapperBase = class
protected
FCtrl : TControl;
public
constructor Create (Ctrl : TControl);
end;
TControlWrapper <T : TControl> = class (TControlWrapperBase)
public
function GetControl : T;
end;
constructor TControlWrapperBase.Create(Ctrl : TControl);
begin
FCtrl := Ctrl;
end;
function TControlWrapper <T>.GetControl : T;
begin
Result := FCtrl as T; // does not compile: E2010 Incompatible Types: TEdit and TControl
if FCtrl is T then // this does work
Result := T (FCtrl);
end;
var
Wrapper : TControlWrapper <TEdit>;
MyCtl : TEdit;
begin
try
MyCtl := TEdit.Create(nil);
TControlWrapper <TEdit>.Create (MyCtl).GetControl;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
如何克服这个编译器错误?
【问题讨论】:
-
我可以重现这个;
ascast 编译失败,出现“不兼容的类型”错误。现在,问题是什么? :-) 顺便说一句,as演员表似乎是多余的。您可以安全地硬播T(FCtrl),因为T被限制为TControl(或后代)。 -
@TOndrej:问题是:为什么会失败?它是编译器错误吗?
-
是的,我个人认为这是一个编译器错误。演员应该成功似乎是合乎逻辑的。此外,编译器具有验证此类转换所需的知识。
标签: delphi generics casting delphi-xe