Ответ 1
Рассмотрим эту простую программу:
type
TClassC<T> = class
private
type
TClassD<T> = class
private
x: T;
end;
end;
var
obj: TClassC<Integer>.TClassD<string>;
begin
obj := TClassC<Integer>.TClassD<string>.Create;
obj.x := 42;
end.
Эта программа компилирует, но испускает следующий намек:
[dcc32 Hint]: H2509 Идентификатор 'T' конфликтует с типом параметров типа контейнера
Назначение доказывает, что x
берет его тип из внешнего общего параметра, а не из внутреннего.
Я должен сказать, что это меня удивило, потому что я ожидал обратного. Я ожидал, что внутренний общий параметр скроет внешний. Фактически, насколько я могу судить, для внутреннего типа нет способа ссылаться на его общий параметр.
Чтобы иметь возможность ссылаться на оба общих параметра, вам нужно будет использовать для них разные имена. Например:
type
TClassC<T1> = class
private
type
TClassD<T2> = class
private
x: T2;
end;
end;
Это то, что заставляет вас использовать аналогичный код шаблона С++.
На мой взгляд, это слабость дизайна языка Delphi, что вам разрешено компилировать код в верхней части этого ответа.