![]() |
Abgeleitete generische Klasse ist nicht mehr generisch
Hallo!
Dieser ![]()
Delphi-Quellcode:
Doch wenn ich diesen Typ dann analog zu TArray<string> als TmyArray<string> verwenden will, meckert der Compiler:
type
TmyArray = class(System.Generics.Collections.TArray) public class function Contains<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>; out ItemIndex: Integer): Boolean; overload; static; class function Contains<T>(const Values: array of T; const Item: T; out ItemIndex: Integer): Boolean; overload; static; class function Contains<T>(const Values: array of T; const Item: T): Boolean; overload; static; class function IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>): Integer; overload; static; class function IndexOf<T>(const Values: array of T; const Item: T): Integer; overload; static; end;
Delphi-Quellcode:
Lasse ich das
procedure Produce;
var myArray: TmyArray<string>; // <-- E2003 Undeklarierter Bezeichner: 'TmyArray<>' begin {...} end;
Delphi-Quellcode:
in der Deklaration weg, kompiliert das zwar, kracht dann aber anschließend (logischerweise) in der Verwendung:
<string>
Delphi-Quellcode:
Und nu steh ich auf dem Schlauch. :-(
procedure Produce;
var myArray: TmyArray; begin myArray := ['Foo', 'Bar', 'Baz']; // <-- E2001 Ordinaltyp erforderlich end; Grüße Cody |
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Edit: Was hier vorher stand war alles Unsinn.
Das TArray von Generics.Collections ist nur eine Klasse mit Helpermethoden für TArray<T> aus der System.pas. Und TArray<T> ist keine Klasse, also kannst du nicht davon ableiten. Was hast du denn vor? Wenn du einfach nur mehr Helper-Methoden willst, dann kannst du dein TmyArray so lassen, aber musst dann deine Variablen trotzdem als TArray<T> (z.B. TArray<String>) deklarieren. |
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Zitat:
|
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Als Class/Record-Helper könnte er seine Methoden aber dennoch dranhängen, selbst wenn Ableiten nicht geht.
|
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Ach, ich bin doch doof :roll: Hab ich doch glatt übersehen, dass das class functions sind. Typischer Fall von Wald und Bäumen ^^
|
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Jetzt bin ich in dem Zusammenhang auf ein weiteres Problem gestoßen:
Delphi-Quellcode:
Die Deklaration von TmyArray hat sich nicht geändert (siehe oben)
const
A_ITEMS: TArray<string> = ['A','B','C']; begin case TmyArray.IndexOf(A_ITEMS, 'B') of // <-- E2532 Generisches Typargument konnte aus den unterschiedlichen Argumenttypen für Methode 'IndexOf' nicht abgeleitet werden 0: ; 1: ; 2: ; end; end; EDIT: Verwende ich statt eines konstanten Arrays eines, das als lokale Variable deklariert ist, dann geht es. Nur warum ist das so? |
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Also was auf jeden Fall gehen sollte wäre halt:
Delphi-Quellcode:
Warum genau der Fehler kommt bzw. warum es mit einer lokalen Variable geht, kann ich so aus dem Stand auch nicht sagen.
case TmyArray.IndexOf<String>(A_ITEMS, 'B') of
Wahrscheinlich denkt er aus irgendeinem Grund, dass auch TmyArray.IndexOf<Char> zutreffen könnte? Aber so richtig sehe ich keinen Grund dafür :gruebel: |
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Zitat:
|
AW: Abgeleitete generische Klasse ist nicht mehr generisch
|
AW: Abgeleitete generische Klasse ist nicht mehr generisch
Danke dir. Mal schauen was passiert. Bis auf Weiteres dann erstmal mit Variablen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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