![]() |
Delphi-Version: 10.4 Sydney
[return: unsafe] mit generischen Interfaces
Hallo zusammen,
unsafe-return scheint mit generischen Interfaces nicht zu funktionieren... Ein Compiler-Bug, oder?
Code:
type
IFoo<T> = interface ['{4D9F70B1-D511-463D-ADCE-13FA342422AF}'] end; IBar = interface ['{C38B6CCE-55A9-4424-B450-FF555098CE58}'] [Result: unsafe] function GetFoo: IFoo<Integer>; // --> [dcc32 Fehler] Unit3.pas(32): E2585 Das Attribut 'unsafe' ist nur für Funktionen zulässig, die eine Klasse oder ein Interface zurückgeben: GetFoo end; IBar<T> = interface ['{C38B6CCE-55A9-4424-B450-FF555098CE58}'] [Result: unsafe] function GetFoo: IFoo<T>; // --> [dcc32 Fehler] Unit3.pas(42): E2585 Das Attribut 'unsafe' ist nur für Funktionen zulässig, die eine Klasse oder ein Interface zurückgeben: GetFoo end; |
AW: [return: unsafe] mit generischen Interfaces
Ich würde eher empfehlen die Referenzzählung des Interfaces zu verändern (in _AddRef/_Release abzuschalten), anstatt nachträglich an der Verwaltung der Variablen/Funktionsergebnisse rumzupfuschen.
(es heißt nicht umsonst "It is considered dangerous and its use is not recommended") Außerdem ist bei Verwendung von Generics an Interfaces es zu bevorzugen die GUIDs nicht hart im Generic zu hinterlegen, sondern erst in den nichtgenerischen Nachfahren anzugeben, denn IFoo<Integer> und IFoo<string> haben die selbe GUID und diese UID soll ja eigentlich "eindeutig" sein, was sie hier aber nicht ist. |
AW: [return: unsafe] mit generischen Interfaces
Naja, das beantwortet die Frage noch nicht so ganz...
Außerdem: Die Aufrufe zur Referenzzählung werden immer einkompiliert. Egal, wie das innen drin implementiert ist. Und die Aufrufe (_AddRef, _Release, außerdem CopyIntf beim Zuweisen und alles mit impliziten try-finally-Blöcken geschützt) sind es, die es langsam machen. Und: Nicht-generische Nachfahren machen hier ja wenig Sinn. Dann würde man TFoo<T> und TBar<T> nicht in der o.g. Weise zusammen verwenden können. |
AW: [return: unsafe] mit generischen Interfaces
Zur Frage "Ein Compiler-Bug, oder?":
"An Unsafe reference is an interface reference that does not increase the reference count of the object they refer to. It is marked with the [unsafe] modifier." Man könnte das so lesen, dass "an" und "the" Einzahl ist, eine generische Klasse aber nicht unbedingt Einzahl ist. Also kein Compiler Bug sondern es geht halt nicht. |
AW: [return: unsafe] mit generischen Interfaces
Also wenn es um Performance-Optimierungen geht indem man sich die virtuellen Aufrufe für _AddRef() und _Release() sparen will, weshalb dann nicht einfach eine TObject-Basisklasse? Dann sieht jeder direkt was Sache ist.
|
AW: [return: unsafe] mit generischen Interfaces
Hab's mal bei Embarcadero als Bug eingestellt und behelfe mit solange mit einem Interface-Pointer statt der Unsafe-Referenz.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz