Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden (https://www.delphipraxis.net/214734-d12-e2382-konstruktoren-koennen-mit-instanzenvariablen-nicht-aufgerufen-werden.html)

himitsu 29. Feb 2024 19:39

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:
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;
...
In einer Class-Function heißt es plötzlich, obwohl es da nirgendwo eine Instanz-Variable gibt, beim
Delphi-Quellcode:
Result := Create(Keys, Data);

Zitat:

[dcc32 Fehler] E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Self wäre ja der ClassType, aus einem unsichtbaren Parameter, aber da es ein Record ist und die Class-Funktion sowieso eine Static ist (sein muß), gibt es Self nicht.
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:
TCryptAttribute.Create(
geht es, aber prinzipiell ist es das Gleiche.

Kas Ob. 1. Mär 2024 08:16

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.

himitsu 1. Mär 2024 08:45

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
 
Delphi-Quellcode:
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;
Ich befürchte langsam, falls das QualityPortal in 18 Monaten wieder online ist,
dass sofort der Server wieder einbrechen wird, auf Grund der schlagartig einlaufenden Millionen BugReports.

peterbelow 1. Mär 2024 13:20

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.

himitsu 1. Mär 2024 13:38

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)

Uwe Raabe 1. Mär 2024 14:24

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.

Kas Ob. 1. Mär 2024 14:53

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 17:46 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