![]() |
Delphi-Version: 12 Athens
D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
In XE funktionierte es noch,
ich weiß die Lösung für D12, aber ich versteh nicht warum.
Delphi-Quellcode:
In einer Class-Function heißt es plötzlich, obwohl es da nirgendwo eine Instanz-Variable gibt, beim
constructor Create(const Key: string; const Value: TBytes); overload;
constructor Create(const Key: string; const Value: string); overload; constructor Create(const Key: string; Value: Integer); overload; constructor Create(const Key: string; Value: Boolean); overload; class function Create(Keys: array of string; Values: array of TBytes): TArray<TCryptAttribute>; overload; static; ...
Delphi-Quellcode:
Result := Create(Keys, Data);
Zitat:
Und auch die beiden Parameter sind Parameter, sowie lokale Variablen, aber bis zu Diesen kommt es eh nicht. Also kann "Self" nur der Typ sein und keine Variable. Ja, mit
Delphi-Quellcode:
geht es, aber prinzipiell ist es das Gleiche.
TCryptAttribute.Create(
|
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Hi,
It looks like a compile bug. I think the compiler had being confused with the exact name Create because it is already being used as constructor, to test this theory, if you change your "class function Create" to "class function CreateEx" it will compile fine, now if you add a constructor with with the name CreateEx then it will report the same error E2382. So yes, it is a bug. |
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Delphi-Quellcode:
Ich befürchte langsam, falls das QualityPortal in 18 Monaten wieder online ist,
type
TTestRec = record constructor Create(const Key: string; const Value: TBytes); overload; constructor Create(const Key: string; const Value: string); overload; class function Create(Keys: array of string; Values: array of TBytes): TArray<TTestRec>; overload; static; class function Create(Keys: array of string; Values: array of string): TArray<TTestRec>; overload; static; end; constructor TTestRec.Create(const Key: string; const Value: TBytes); begin end; constructor TTestRec.Create(const Key, Value: string); begin end; class function TTestRec.Create(Keys: array of string; Values: array of TBytes): TArray<TTestRec>; begin end; class function TTestRec.Create(Keys, Values: array of string): TArray<TTestRec>; var Data: TArray<TBytes>; begin Result := Create(Keys, Data); // [dcc32 Fehler] E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden //Result := TTestRec.Create(Keys, Data); end; dass sofort der Server wieder einbrechen wird, auf Grund der schlagartig einlaufenden Millionen BugReports. |
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Wenn Du eine class function als "static" deklarierst hat sie keinen versteckten Self-Parameter und damit auch keine Klassenreferenz, die sie an einen Constructor weeitergeben könnte.
|
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Ich weiß, aber selbst ohne static (was bei Record aber nicht geht),
wäre Self ein TClass und nicht TObject, womit es dann ebenfalls keine Instanzvariable wäre. Gut, genauer wird hier das Create über den Scope gefunden. Wie gesagt, ich kann hier einfach keine Instanzvariable entdecken, über welche sich der Compiler beschweren könnte, abgesehn davon, dass dieses "Create" kein Konstructor, sondern eine ClassFunction ist. (OK, es gibt eine Überladung als Konstructor, aber dennoch) |
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Ich könnte mir vorstellen, dass hier einfach die Overload-Auflösung in die Hose geht.
|
AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
I see the same behavior for both Records and Classes, but on XE8
Code:
type
TMyClass = class constructor Create; overload; function CreateEx(Value: string): string; overload; class function Create(Value: Integer): Integer; overload; class function CreateEx(Value: Integer): Integer; overload; procedure InternalTest; end; TMyRec = record constructor Create(Value: string); overload; function CreateEx(Value: string): string; overload; class function Create(Value: Integer): Integer; overload; static; class function CreateEx(Value: Integer): Integer; overload; static; procedure InternalTest; end; { TMyClass } constructor TMyClass.Create; begin end; class function TMyClass.Create(Value: Integer): Integer; begin Result := Value; end; function TMyClass.CreateEx(Value: string): string; begin Result := Value; end; class function TMyClass.CreateEx(Value: Integer): Integer; begin Result := Value; end; procedure TMyClass.InternalTest; begin //Create(5); // [dcc32 Error] Project5.dpr(54): E2382 Cannot call constructors using instance variables CreateEx(5); // Compile Fine end; { TMyRec } class function TMyRec.Create(Value: Integer): Integer; begin Result := Value; end; constructor TMyRec.Create(Value: string); begin end; class function TMyRec.CreateEx(Value: Integer): Integer; begin Result := Value; end; function TMyRec.CreateEx(Value: string): string; begin Result := Value; end; procedure TMyRec.InternalTest; begin //Create(5); // [dcc32 Error] Project5.dpr(81): E2382 Cannot call constructors using instance variables CreateEx(5); // Compile Fine end; |
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