Reported by Michael Stratmann; checked by Reinier Sterkenburg
以下のコードを良く見てください:
あるユニットで以下のようにします:
type
TMyRecord = record
Field1: Integer;
end;
TMyClass = class
private
FRec: TMyRecord;
public
property Rec: TMyRecord read FRec;
end;
別のユニット(またはプログラム)で以下のようにします:
var
AnObj: TMyClass;
begin
AnObj := TMyClass.Create;
AnObj.Rec.Field1 := 1; // コンパイルエラー: 代入できない左辺値です
with AnObj.Rec
do Field1 := 1; // コンパイルが通ります
(Delphi 1 の場合、コンパイラの振る舞いは一貫しており、両方の代入文でエラー(無効な変数参照)が発生します)
最初の代入がコンパイル出来ないのに、with ステートメントを使った二つ目の代入がコンパイル出来てしまうのは奇妙(誤り)です。両方コンパイル出来るか、両方コンパイル出来ないか、どちらかであるべきです。
プロパティ Rec が object(class)の場合、両方ともコンパイルを通ります(そして静的オブジェクトの場合は record と同じ振る舞いをします)。
|