我遇到这种情况:
type
TWheel = record
private type
TWheelEnum = (whBA, whCA, whFI, whGE, whMI, whNA, whPA, whRM, whRN,
whTO, whVE);
var
FWheelEnum: TWheelEnum;
public
class operator Implicit(const Value: string): TWheel;
class operator Implicit(const Value: TWheel): string;
end;
使用:
var
awheel, bwheel: twheel;
begin
try
awheel := 'PA';
bwheel := 'PA';
if awheel = bwheel then writeln ('pippo');
end.
当我运行它时,请转过来这个错误:
E2015 Operator not applicable to this operand type
我已经解决了写作:
if awheel = string(bwheel) then writeln ('pippo');
但是可以在没有添加字符串(...)的情况下解决它?在第一时刻,我认为是:
class operator Implicit(const Value: TWheel): Twheel;
但编译器给我错误,告诉我只接受一个TWheel类型。所以我想知道是否有解决方案,或者我是否需要使用带字符串(...)的转换类型? 非常感谢。
答案 0 :(得分:8)
您需要定义Equal
运算符:
class operator Equal(const a, b: TWheel): Boolean;
我想实现应该是:
class operator TWheel.Equal(const a, b: TWheel): Boolean;
begin
Result := a.FWheelEnum=b.FWheelEnum;
end;
您可能还希望实施NotEqual
运算符。
class operator TWheel.NotEqual(const a, b: TWheel): Boolean;
begin
Result := a.FWheelEnum<>b.FWheelEnum;//could write not (a=b) instead
end;
事实上,这些运算符的定义足以让编译器接受与混合TWheel
和string
操作数的等式比较。
documentation中提供了完整的运算符列表,值得一读一次,以便重新了解运算符重载的可用内容。