AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden
Thema durchsuchen
Ansicht
Themen-Optionen

D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

Ein Thema von himitsu · begonnen am 29. Feb 2024 · letzter Beitrag vom 1. Mär 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 29. Feb 2024, 20:39
Delphi-Version: 12 Athens
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
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 TCryptAttribute.Create( geht es, aber prinzipiell ist es das Gleiche.
$2B or not $2B

Geändert von himitsu (29. Feb 2024 um 20:42 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#2

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 09:16
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.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 09:45
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.
$2B or not $2B
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#4

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 14:20
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.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 14:38
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 15:24
Ich könnte mir vorstellen, dass hier einfach die Overload-Auflösung in die Hose geht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#7

AW: D12: E2382 Konstruktoren können mit Instanzenvariablen nicht aufgerufen werden

  Alt 1. Mär 2024, 15:53
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;
Kas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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