Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.193.232] |
|
Сообщ.
#1
,
|
|
|
Есть рекорд с перегруженными операторами сравнения и умножения. только почему то сравнение - не компилируется, а умножение компилируется.
Вопрос: почему ?? Компирирую в Delphi 10.2 (Токио) если у кого нить есть рио, проверьте там тоже пожлста. type TMyRecord2 = record public class operator Equal(const a: TMyRecord2; const b: array of Integer): boolean; class operator Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; end; class operator TMyRecord2.Equal(const a: TMyRecord2; const b: array of Integer): boolean; begin Result := True; end; class operator TMyRecord2.Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; begin Result := a; end; procedure TForm1.FormClick(Sender: TObject); var R: TMyRecord2; B: boolean; begin B := R = [10]; // Почему эта строка не компилируются R := R * [10]; // а это компилируется end; updated: убрал лишний код не влияющий на проблему |
Сообщ.
#2
,
|
|
|
компилятор почему-то считает, что [10] - множество а не массив (замени на [1000])
|
Сообщ.
#3
,
|
|
|
Угу, похоже. Заменил Integer на Double - ошибка поменялась на [dcc32 Error] Project1.dpr(37): E2001 Ordinal type required
При этом умножение - всё так же работает. program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyRecord2 = record public class operator Equal(const a: TMyRecord2; const b: array of Double): boolean; class operator Multiply(const a: TMyRecord2; const b: array of Double): TMyRecord2; end; class operator TMyRecord2.Equal(const a: TMyRecord2; const b: array of Double): boolean; begin Result := True; end; class operator TMyRecord2.Multiply(const a: TMyRecord2; const b: array of Double): TMyRecord2; begin Result := a; end; var b: boolean; r: TMyRecord2; i: Double; begin try r := r * [10.0]; // this line is compiled b := r = [10.0]; // this line is not compiled except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |