Оператор не применим к этому типу операнда - PullRequest
4 голосов
/ 25 ноября 2011

у меня такая ситуация:

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. Итак, я хотел знать, есть ли решение для этого, или мне нужно использовать тип преобразования со строкой (...)? Большое спасибо.

1 Ответ

8 голосов
/ 25 ноября 2011

Вам необходимо определить оператор 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.

Полный список операторов приведен в документации , и стоит прочитать его время от времени, чтобы заново ознакомиться с тем, что доступно при перегрузке операторов.

...