Once in a while I run into this problem and every single time it takes me forever to remember the cause:
Say, you have got an interface and a class implementing that interface:
type
IMyInterface = interface
function asMyInterface: IMyInterface;
end;
type
TMyClass = class(TInterfacedObject, IMyInterface)
private
function asMyInterface: IMyInterface;
end;
[...]
function TMyClass.asMyInterface: IMyInterface;
begin
Result := Self as IMyInterface; // compile error here
end;
This will fail to compile in the marked line with the error “Operator not applicable to this operand type”.
The reason is simple: In order for the as operator to work on interfaces, the interface must have a GUID assigned to it. You do that in the Delphi IDE by positioning the cursor after the interface keyword and press Shift+Ctrl+G. As soon as your interface declaration looks like this …
type
IMyInterface = interface ['{93903D10-58F7-41B0-AFB1-2A8E17F828EF}']
function asMyInterface: IMyInterface;
end;
… the code will compile.
(Don’t just copy this code, you will need to generate your own unique GUID as described above! Otherwise you will experience strange things.)