次のコードがあります(簡略化):
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit1 in 'Unit1.pas';
var
f: TFoo<Integer>;
begin
f := TFoo<Integer>.Create;
f.Baz;
Readln;
end.
unit Unit1;
{$D-}
interface
type
TFoo = class
public
procedure Bar(const s: string);
end;
TFoo<T> = class(TFoo)
public
procedure Baz;
end;
implementation
uses
TypInfo;
{ TFoo }
procedure TFoo.Bar(const s: string);
begin
Writeln(s);
end;
{ TFoo<T> }
procedure TFoo<T>.Baz;
begin
Bar(PTypeInfo(TypeInfo(T)).Name);
end;
end.
ステップインすると、そのユニットのデバッグ情報を明示的に無効にしましたが、どちらが正しいかステップf.Baz
インUnit1.TFoo<T>.Baz
できませんでした。TFoo.Bar
これは、ジェネリックが内部でどのように実装されているか (テンプレートなど) と、TFoo<Integer>
が my で定義されているためだと思いProject1
ます。次のユニットを追加すると、Baz
もうステップインできなくなります。
unit Unit2;
{$D-}
interface
uses
Unit1;
type
TIntegerFoo = TFoo<Integer>;
implementation
end.
ジェネリック型のデバッグ情報を完全に削除して、その型をどこでも (デバッグ情報がオンになっている) 特殊化できますが、ジェネリック型のメソッドにステップインしないようにする方法はありますか? Generics.Collections.TList<T>
「use debug .dcus」オプションを有効にしないとメソッドをステップ実行できないため、可能であるに違いないと思います。