![]() |
Delphi-Version: 10 Seattle
Typdefinition: Generics in Generics gehen nicht?
Ich glaube der Covfefe ☕ war zu schwach und ich stehe auf dem Schlauch.
Warum geht folgendes nicht, bzw. was muss ich tun damit es geht?
Delphi-Quellcode:
Der Compiler nimmt die Definition für mein TMyObject nicht an.
uses
System.SysUtils; type Nullable<T> = record value: T; hasValue: Boolean; end; TStruct = record someFloat: Nullable<Single>; end; TMyObject = class(TObject) // E2564 Undefinierter Typ 'Nullable<T>' myStruct: Nullable<TStruct>; end; Im ![]() Zitat:
|
AW: Typdefinition: Generics in Generics gehen nicht?
Okay das verstehe ich auch nicht.
Man kann aber ansonsten als globale/lokale Variable ohne Probleme ein Nullable<TStruct> deklarieren. Es scheint aus irgendeinem Grund nur in Klassen/Records nicht zu gehen.
Delphi-Quellcode:
Macht in meinen Augen keinen Sinn. Aber mal abwarten was Uwe dazu sagt :mrgreen:
var
Form1: TForm1; y: TNullable<TStruct>; // Geht implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var x: TNullable<TStruct>; // Geht begin end; |
AW: Typdefinition: Generics in Generics gehen nicht?
Zitat:
Mit einem zusätzlichen
Delphi-Quellcode:
funktioniert es - zumindest unter 10.3.3:
Type
Delphi-Quellcode:
type
Nullable<T> = record value: T; hasValue: Boolean; end; TStruct = record someFloat: Nullable<Single>; end; type TMyObject = class(TObject) myStruct: Nullable<TStruct>; end; |
AW: Typdefinition: Generics in Generics gehen nicht?
wtf (⊙_⊙)?
Tatsächlich. Auch unter 10.0 Seattle. Was für eine merkwürdige Welt. |
AW: Typdefinition: Generics in Generics gehen nicht?
Wollte ich auch grade vorschlagen.
Delphi führt ein "type" als Gruppe aus, darum kann man dort auch mit Forward-Deklarationen von Klassen-Typen arbeiten, nur wird ja der Generic hier erst im Anschluß "richtig" erzeugt und ist somit noch nicht vorhanden. hier darf kein TYPE zwischen den beiden A= sein
Delphi-Quellcode:
type
A = class; R = record a: A; end; A = class() ... end; Gut, der Compiler könnte für Generics nochmal in die aktuelle Verarbeitungsliste schauen und wenn der Generic-Name dort zu finden ist, dann eine "verständlichere" Fehlermeldung ausgeben. |
AW: Typdefinition: Generics in Generics gehen nicht?
Faszinierend, das wusste ich nicht. Schwer zu merken, aber das bekomme ich hoffentlich noch hin. Danke euch beiden!
|
AW: Typdefinition: Generics in Generics gehen nicht?
Das braucht man zu Beispiel, wenn sich zwei Klassen gegenseitig referenzieren, also in der Definition der Klasse A brauchst du B und in B willst du auch A haben.
Delphi-Quellcode:
Im TB ist schon bekannt wie groß der Zeiger (Variable) auf TA ist, drum kann auch ohne Kenntis des genauen Aufbaus von TA, das TB bereits zusammengebaut werden.
type
TA = class; TB = class A: TA; end; TA = class B: TB; end; Deshalb geht es auch nur für Klassen und nicht z.B. für Records. Wenn TB nur in der Implementation auf den Typen TA zugreift, dann wäre das nicht nötig. |
AW: Typdefinition: Generics in Generics gehen nicht?
Zitat:
|
AW: Typdefinition: Generics in Generics gehen nicht?
Zitat:
Helper gehen aber allgemein nicht für Generics, daher ist das eigentlich schon OT. |
AW: Typdefinition: Generics in Generics gehen nicht?
Records sich selber referenzieren geht auch ohne Methoden. Schönes Beispiel von vor 30 Jahren bei Prof. Dr. Rudolf Herschel gelernt waren doppelt verkettete Listen. :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 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