Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generics in Attributen? (https://www.delphipraxis.net/180113-generics-attributen.html)

Der schöne Günther 23. Apr 2014 17:37

Delphi-Version: XE5

Generics in Attributen?
 
Folgendes

Delphi-Quellcode:
   MyAttribute<T> = class(TCustomAttribute)
      protected var someValue: T;
      public constructor Create(const someValue: T);
   end;


   TMyTaggedClass = class
      protected var
         [MyAttribute<Integer>(123)]
         someVariable: String;
   end;
liefert
Code:
[dcc32 Warnung] Project2.dpr(25): W1025 Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut'

Stelle ich mich zu dumm an oder kann ich die Idee vergessen? Ich wollte ein paar Feldern ein Art Default-Wert mitgeben. Und ich wollte vermeiden, für jeden möglichen Typ ein eigenes Attribut basteln zu müssen...

himitsu 23. Apr 2014 17:44

AW: Generics in Attributen?
 
Da kommt einfach irgendwas mit dem < und > im Typnamen nicht klar.
Dieses Problem ist auch bei anderen Dingen vertreten, wie z.B. publisched Felder in der DFM und, ich glaub, das DataSnap muckte da auch etwas rum.

Delphi-Quellcode:
type
   MyGenericAttribute<T> = class(TCustomAttribute)
      protected var someValue: T;
      public constructor Create(const someValue: T);
   end;
   MyIntegerAttribute = class(MyGenericAttribute<Integer>);
   MyStringAttribute = class(MyGenericAttribute<String>);

   TMyTaggedClass = class
      protected var
         [MyIntegerAttribute(123)]
         someVariable: String;
   end;

Union 23. Apr 2014 17:55

AW: Generics in Attributen?
 
Das liegt evtl. auch an der automatischen Suffexierung der Delphi-Attribute mit "attribute". Dein Beispiel sollte ja auch mit
Delphi-Quellcode:
My(123)
gültig sein.

Der schöne Günther 23. Apr 2014 17:57

AW: Generics in Attributen?
 
Stimmt, das könnte wirklich daran liegen...

Uwe Raabe 23. Apr 2014 20:25

AW: Generics in Attributen?
 
Guckst du hier: E2565 Parametrisierter oder instantiierter Typ kann nicht als benutzerdefiniertes Attribut verwendet werden(Delphi)

himitsu 23. Apr 2014 21:04

AW: Generics in Attributen?
 
Zitat:

Dieser Fehler tritt bei dem Versuch auf, RTTI-Informationen von einem generischen Typ abzuleiten.
Ableiten? :stupid:


Das, was die da machen, ist einen Alias zu verwenden, aber der Compiler ersetzt diesen sofort wieder durch den eigentlichen Typ, womit der Code dem des TEs entspricht.

"Richtig" ableiten, siehe mein Beispiel.

Uwe Raabe 23. Apr 2014 21:27

AW: Generics in Attributen?
 
Zitat:

Zitat von himitsu (Beitrag 1256693)
Zitat:

Dieser Fehler tritt bei dem Versuch auf, RTTI-Informationen von einem generischen Typ abzuleiten.
Ableiten? :stupid:


Das, was die da machen, ist einen Alias zu verwenden, aber der Compiler ersetzt diesen sofort wieder durch den eigentlichen Typ, womit der Code dem des TEs entspricht.

Das Beispiel in der Fehlerbeschreibung zeigt exakt eben genau das was Günther versucht hat. Allein duch den Alias-Typen kommt man aber erst zu dieser Fehlermeldung, die einfach nur besagt, daß sowas nicht geht.

Das "ableiten", das du in deinem Quote bemängelst, hat hier wohl eher die Bedeutung von "herleiten" im Sinne von Informationen ermitteln. Der Englische Originaltext macht das deutlicher:

Zitat:

This occurs when trying to infer RTTI from a generic type.

himitsu 23. Apr 2014 21:39

AW: Generics in Attributen?
 
Dann ist aber der Compiler defekt, wenn er die richtige Fehlermeldung nur bei einem Alias ausgibt, obwohl er eigentlich den generischen Typ meint. :wall:

PS: Zumindestens (in XE3) gibt sogar das Error-Insight einen Fehler aus, daß es den generischen Typ dort nicht mag. :thumb:
(auch wenn dessen Fehlermeldung nichtssagend ist)

Uwe Raabe 23. Apr 2014 22:12

AW: Generics in Attributen?
 
Zitat:

Zitat von himitsu (Beitrag 1256702)
Dann ist aber der Compiler defekt, wenn er die richtige Fehlermeldung nur bei einem Alias ausgibt, obwohl er eigentlich den generischen Typ meint. :wall:

Defekt in dem Sinne, daß er nur eine Warnung abgibt, den Code aber trotzdem compiliert! Die Meldung "W1025 Sprach-Feature wird nicht unterstützt: 'Benutzerdefiniertes Attribut'" führt einen schlicht und ergreifend in die Irre. Was der Compiler eigentlich sagen will ist: "Hey, du hast da ein Attibut verwendet, das ich nicht kenne. Hast du dich eventuell verschrieben?" Die gleiche Warnung kommt nämlich auch wenn man einen Tippfehler bei der Attributangabe macht. Man darf sich bei den Attributen nämlich durchaus verschreiben - es funktioniert dann nur nicht wie man will (logisch).

Ich hatte eigentlich damit gerechnet, daß der Bug in XE6 behoben ist, aber...

Der schöne Günther 24. Apr 2014 09:03

AW: Generics in Attributen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1256697)
Allein duch den Alias-Typen kommt man aber erst zu dieser Fehlermeldung, die einfach nur besagt, daß sowas nicht geht.

Das wäre mir nie aufgefallen. Gut, dass es euch gibt :love:

Zitat:

Zitat von Uwe Raabe (Beitrag 1256704)
Ich hatte eigentlich damit gerechnet, daß der Bug in XE6 behoben ist, aber...

Wenn Embarcadero meint dass es "as designed" wäre, würde ich ihnen allerdings auch zustimmen: Es kann ja jeder einstellen, ob man nichts, eine Warnung oder einen Fehler haben möchte. Ich stelle es auch immer auf "Fehler" ein, aber das ist doch genauso ein "Bug" wie bsp. keine Bereichsprüfung in der Debug-Fassung oder Assertions im Release. Über alles kann man sich streiten, aber zum Glück kann es jeder einstellen wie er mag...



Trotzdem etwas schade, dass es nicht geht. Das Beispiel im DocWiki ist auch so ziemlich, was ich vorhatte. Aber naja, in Java geht's schließlich auch nicht :stupid:

himitsu 24. Apr 2014 10:45

AW: Generics in Attributen?
 
Indirekt geht es ja, wenn du dir einen nichtgenerischen Nachfahren ableitest.

Uwe Raabe 24. Apr 2014 12:17

AW: Generics in Attributen?
 
Zitat:

Zitat von himitsu (Beitrag 1256757)
Indirekt geht es ja, wenn du dir einen nichtgenerischen Nachfahren ableitest.

:wiejetzt: Gerade das führt doch zu besagtem Fehler E2565 - oder habe ich dich jetzt falsch verstanden?

Der schöne Günther 24. Apr 2014 12:19

AW: Generics in Attributen?
 
Nein, da hat er schon recht: Wenn man vom generischen Attribut wieder eine Unterklasse (ohne generische Typinformation) bildet geht es wieder (Siehe sein erster Post).

Im Endeffekt hat man dadurch meist zwar nicht viel gewonnen, aber es geht. Irgendwie ähnlich wie Parametrisierte Interfaces vs. GUID. Manchmal bilde ich von einem parametrisierten Interface nur ein Unter-Interface ohne Typ nur um ihm eine feste GUID geben zu können...

Uwe Raabe 24. Apr 2014 12:29

AW: Generics in Attributen?
 
Ja, jetzt habe ich auch verstanden, was er meint.

himitsu 24. Apr 2014 13:03

AW: Generics in Attributen?
 
Jupp, der Fehler E2565 hat leider einen Fehler.
Eigentlich meint der ja, daß man keinen generischen Typ verwenden kann, aber wenn man direkt den generischen Tüp angibt, dann raucht es ab und deine ursprüngliche Fehlermeldung erscheint.
Versteckt man den generischen Typ aber hinter einem Alias, obwohl das am Ende auch nur den generischen Typ eribt, dann taucht plötzlich die "richtige" Fehlermeldung E2565 auf.

Wenn man den generischen Typ aber in einen nicht-generischen ableitet/vererbt, dann gibt es keine Probleme.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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