更新: 簡単な回避策。メソッド/演算子フィールドの前のデータフィールド。
今日は、私が作成できる最も簡単な例を使用して、このバグを再現しようとしました。
単純なsetメソッドとprintメソッド(演算子なし)のみを持つ基本レコード(TBasicRecord)から始めましたが、const x:TBasicBecordを渡すのに問題はありませんでした。
次に、バグを引き起こすと考えている単項演算子を追加しましたが、レコードをconstとして渡すことに問題はありません。
次に二項演算子を追加しましたが、それでもバグは表面化しませんでした。
最後に、簡単な例で、メソッドフィールドの前にデータフィールドを宣言していることに気付きました。これで、バグをミュートするために必要なすべてのことがわかりました。
データフィールドもプライベートにしたので、最初はそれが問題だと思っていましたが、結局は関係ないことがわかりました。違いを生む唯一のことは、データフィールドを演算子フィールドとメソッドフィールドの前に配置したかどうかです。
全体的に、私はこの解決策に満足しています。個人的には、とにかくデータフィールドを常に最初に置いてきました。レコード型を「const」パラメータとしてどこにも渡そうとしない限り、逆の方法でそれを行っても他の問題が発生しないように見えるのはおかしいです。
元の投稿:
以前はDelphi7を使用していましたが、今日はDelphi 2006をインストールして、D7がサポートしていない演算子メソッドにアクセスできるようにしました。
ここでの以前の質問への回答の1つにリストされているコード(複素数の実装)をコンパイルしようとしました:TComplexMathクラス(ソースを含む)の簡単な例をリクエストしてください
関連するコードの部分的なリストは次のとおりです。
type
TComplex = record
public
class operator Implicit(const D: Double): TComplex;
class operator Negative(const C: TComplex): TComplex;
class operator Equal(const C1, C2: TComplex): Boolean;
class operator NotEqual(const C1, C2: TComplex): Boolean;
class operator Add(const C1, C2: TComplex): TComplex;
class operator Add(const C: TComplex; const D: Double): TComplex;
class operator Add(const D: Double; const C: TComplex): TComplex;
class operator Subtract(const C1, C2: TComplex): TComplex;
class operator Subtract(const C: TComplex; const D: Double): TComplex;
class operator Subtract(const D: Double; const C: TComplex): TComplex;
class operator Multiply(const C1, C2: TComplex): TComplex;
class operator Multiply(const C: TComplex; const D: Double): TComplex;
class operator Multiply(const D: Double; const C: TComplex): TComplex;
class operator Divide(const C1, C2: TComplex): TComplex;
class operator Divide(const C: TComplex; const D: Double): TComplex;
class operator Divide(const D: Double; const C: TComplex): TComplex;
function IsZero: Boolean;
function IsNonZero: Boolean;
function Conj: TComplex;
function Sqr: TComplex;
function Sqrt: TComplex;
function Mag: Double;
function SqrMag: Double;
public
r: Double;
c: Double;
end;
class operator TComplex.Negative(const C: TComplex): TComplex;
begin
Result.r := -C.r;
Result.c := -C.c;
end;
---- etc ---
問題は、このコードを(D2006で)コンパイルしようとすると、TComplex型をとるすべての演算子がE2037のエラーを出すことです。「----」の宣言は前の宣言とは異なります。(ここで、「---」は演算子名です)。
私の回避策は、すべてのTComplexパラメーターからconstキーワードを削除するだけで、コードが正しく準拠(および実行)されることでした。「constx:Double」パラメーターを保持できます。コンパイラーはそれらにエラーを出しませんが、他のすべてから「const」を削除する必要がありました。
これが有効になっていないコンパイラオプションであるかどうか誰かが知っていますか?または、これはDelphiの新しいバージョンではサポートされていますが、D2006ではサポートされていませんか?それとも私が何か他のことを間違ってやっているだけですか?
また、ここでconstパラメーターを使用できない場合は、constの代わりにvarを使用するだけの利点があります(constキーワードを完全に削除する場合と比較して)。