AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [return: unsafe] mit generischen Interfaces
Thema durchsuchen
Ansicht
Themen-Optionen

[return: unsafe] mit generischen Interfaces

Ein Thema von archimedix · begonnen am 11. Jul 2022 · letzter Beitrag vom 12. Jul 2022
Antwort Antwort
archimedix

Registriert seit: 17. Jul 2011
22 Beiträge
 
Delphi 10.4 Sydney
 
#1

[return: unsafe] mit generischen Interfaces

  Alt 11. Jul 2022, 17:27
Delphi-Version: 10.4 Sydney
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;

Geändert von archimedix (11. Jul 2022 um 17:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: [return: unsafe] mit generischen Interfaces

  Alt 11. Jul 2022, 18:07
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.
$2B or not $2B

Geändert von himitsu (11. Jul 2022 um 18:13 Uhr)
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
22 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: [return: unsafe] mit generischen Interfaces

  Alt 11. Jul 2022, 18:33
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.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: [return: unsafe] mit generischen Interfaces

  Alt 12. Jul 2022, 08:49
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: [return: unsafe] mit generischen Interfaces

  Alt 12. Jul 2022, 09:23
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.
  Mit Zitat antworten Zitat
archimedix

Registriert seit: 17. Jul 2011
22 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: [return: unsafe] mit generischen Interfaces

  Alt 12. Jul 2022, 20:37
Hab's mal bei Embarcadero als Bug eingestellt und behelfe mit solange mit einem Interface-Pointer statt der Unsafe-Referenz.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz