Ich habe die folgende Deklaration einer Klasse in Delphi XE8:Mit eigenen Klasse als Typ-Parameter Einschränkung in Klassendeklaration
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
, das die folgenden Compiler-Fehler führt:
E2086 Type 'TestClass' is not yet completely defined
Als ich hinzufügen eine andere Klasse für den Mix und verwenden Sie diese als Einschränkung stattdessen, es funktioniert gut:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
Ich susp Das Problem ist, dass die Forward-Typ-Deklaration Delphi noch nicht genug über den Typ TestClass
informiert. Dies ist vielleicht noch deutlicher, da der folgende Versuch, um das Problem auf einer anderen Linie, die die gleichen Compiler-Fehler führt zu arbeiten:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
Mache ich etwas falsch, und wenn nicht, gibt es eine Möglichkeit, um dieses Problem?
Es scheint, dass dies einen Fehler in dem Compiler ist, damit ich einen [Bug-Report hier] eingereicht haben (https://quality.embarcadero.com/ Durchsuchen/RSP-13348). – overactor
Natürlich der Code "TestClass = Klasse; AnotherTestClass = Klasse (TestClass) // Compiler Fehler Ende;" sollte den gezeigten Fehler erzeugen, da Delphi ein Single-Pass-Compiler ist. Aber ich sehe keinen Grund, warum das gleiche für das Konstrukt gilt, das Sie erstellen möchten. Zu diesem Zeitpunkt sind genügend Informationen verfügbar, damit die Definition gültig ist. – Dsm
@Dsm stimmte zu, aber da der Compiler-Fehler der gleiche ist, dachte ich, es ist ein Hinweis darauf, was falsch läuft. Dies führt jedoch zu einem Problem, was ist, wenn ich zwei Klassen möchte, die sich gegenseitig als Typparameter-Einschränkung verwenden? – overactor