Possible en double:
“As” operator for constrained generic typesproblème Generics et CAST
Le code réduit exemple suivant produit une erreur de compilation lors d'une tentative de jeter le type générique en utilisant l'opérateur as
. Curieusement, la combinaison de l'opérateur is
et d'une distribution dure fonctionne comme prévu.
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.
Comment cette erreur du compilateur peut-elle être surmontée?
Je peux reproduire ceci; La distribution 'as' échoue à compiler avec l'erreur 'incompatible types'. Maintenant, quelle est la question? :-) BTW, la distribution «as» semble superflue. Vous pouvez sécuriser hardcast 'T (FCtrl)' car 'T' est contraint à être un' TControl' (ou descendant). –
@TOndrej: la question est: pourquoi échoue-t-elle? Est-ce un bug de compilateur? – jpfollenius
Oui, personnellement, je le considère comme un bug du compilateur. Il semble logique que la distribution devrait réussir. En outre, le compilateur a les connaissances dont il a besoin pour valider une telle distribution. –