2010-08-11 13 views
6

In einigen Code, den ich bis zur Festsetzung, die starke Nutzung von Generika und eine Schnittstelle Typen macht, erhalte ich FehlerWas bedeutet der Delphi-Compiler-Fehler E2134?

 E2134, Type '<void>' has no type info.

Ich glaube, es liegt daran, dass ich in der Mitte eines Refactoring bin, wo einige tief verschachtelten Satz von Einheiten, die alle Generics verwenden, sind nicht synchronisiert, aber der Fehler tritt nicht an einem Ort auf, an dem ich die Fehlermeldung verwenden kann, um den Code zu beheben, da an dem Ort, an dem der Fehler auftritt, nichts falsch mit dem Code ist . Hier

ist der Kontext, verspottet, weil ich den Code nicht veröffentlichen kann, gibt es zu viel:

unit GenericThing; 
... 
interface 
... 
type 
... 
IThingListOf<ThingT> = interface(IThingContainer) 
    function getEnumerator: TEnumerator<ThingT>; 
    function getCount: Integer; 
    function getThing(Index: integer): ThingT; 
    function getFirst: ThingT; 
     function IndexOf(value: ThingT): integer; 
    function addItem(const Thing: ThingT): ThingT; 
     function removeItem(const Thing: ThingT): Integer; 
    procedure clear; 
    procedure Sort; overload; 
    procedure Sort(const AComparer: IComparer<ThingT>); overload; 
    property Count: integer read getCount; 
    property First: ThingT read getFirst; 
    property Items[Index: integer]: ThingT read getThing; default; 
    end; 

// error appears on whatever line number comes after the declaration of IThingListOf<ThingT>...end; 
    function AnythingYouLikeHere:Integer; // there is nothign wrong with this line, but you get the E2134 here. 

Es scheint, dass das Problem in IThingContainer selbst:

IThingContainer = interface ... 
     ... 
     procedure DoSomething(const Param); 
    end; 

der oben "const Param" hat keine Typinformationen. Das ist meiner Meinung nach eine seltsame (Achsel) von Pascal/Delphi, in der Sie Wirths Idee des starken Tippens völlig verletzen. Es ist ungefähr so ​​schwach typisiert wie ein "void *" -Zeiger in C oder der "Zeiger" -Typ in Delphi, aber es wird selten benutzt, außer an Orten wie den Standard-pre-object-pascal RTL-Funktionen wie Move und so auf. Meiner Meinung nach sollten untypisierte Parameter in Schnittstellen, die in Generika verwendet werden, entweder erlaubt oder nicht erlaubt sein, aber manchmal nicht erlaubt und andere Male nicht erlaubt sein.

Dies ist ein Fall einer Pascal-Funktion von 1978 schlecht mit einem Object Feature von 2009

Antwort

15

Die Fehlermeldung bedeutet, dass für den angegebenen Typ keine Typinformationen verfügbar sind.

Hier ist ein Minimalprogramm, das die Meldung erzeugt:

type 
    {$M+} 
    IThing = interface 
    procedure P(const X); 
    end; 
    {$M-} 
begin 
end. 

Das Problem, wie es scheint, ist, dass IThingListOf<>, oder einer seiner Vorfahren, wurde mit {$M+} aktiv zusammengestellt. Der Compiler vermutet von diesem, dass Sie wirklich volle Typinformation für die Schnittstelle wünschen; Ursprünglich wurde es von SOAP etc. verwendet, um Stubs usw. zu erzeugen. Die Schnittstelle RTTI unterstützt keine untypisierten Parameter (logisch genug, sie können nicht durch SOAP o.ä. gemarshallt werden) - und sie erscheinen als vom void type, und Sie enden mit dieser Fehlermeldung.

Die Lösung ist, entweder {$M+} nicht zu verwenden - obwohl vermutlich die RTTI verwendet wird, andernfalls würde es nicht aktiviert werden - oder z. Pointer statt, und übergeben Sie die Adresse explizit.

+0

BRILLIANT. Vielen Dank. –

1

Es ist ein bisschen schwer zu sagen, von diesem, vor allem ohne die Definition von IThingContainer Mischen zur Verfügung. Wenn Sie die Schnittstellendefinition kommentieren, wird sie nach diesem Punkt kompilieren? Offensichtlich wird es brechen, wenn Sie versuchen, eine Klasse zu erstellen, die die Schnittstelle implementiert, aber es auskommentiert dieses Problem beheben?

Wenn ja, dann erstickt der Compiler auf etwas in der Schnittstellendefinition. Versuchen Sie, Teile davon zu kommentieren, um herauszufinden, wo das Problem liegt. Wenn nicht, dann müssen Sie woanders suchen.

+0

Es scheint nur zu geschehen, wenn IThingContainer Schnittstellenmethoden definiert, die nicht typisierte Parameter in Funktionen enthalten. Was wirklich merkwürdig ist, ist, dass manchmal untypisierte Parameter in Funktionen definiert werden können, und manchmal nicht. Ich schaue mir eine Codebasis an, die untypisierte Parameter stark verwendet.Das Ändern aller Parameter in IThingContainer, die eingegeben werden sollen, behebt das Problem, aber ich kann nichts darüber herausfinden, warum dies geschieht. –