Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Class helper wird angewendet obwohl er es nicht sollte (https://www.delphipraxis.net/200682-class-helper-wird-angewendet-obwohl-er-es-nicht-sollte.html)

Der schöne Günther 15. Mai 2019 10:56

Delphi-Version: 10 Seattle

Class helper wird angewendet obwohl er es nicht sollte
 
Ich habe einen Class Helper der sich auf Dinge anwenden lässt für die er nie gedacht war. Der Compiler hat nichts dagegen, die Code-Vervollständigung schläft es sogar aktiv vor - Nur zur Laufzeit fliegt einem natürlich alles um die Ohren.

Folgender Helper:

Delphi-Quellcode:
unit Unit3;

interface uses System.Generics.Collections;

type
   TSomething = class(TObject);

   TSomethingEnumerator = TEnumerator<TSomething>;

   TSomethingEnumeratorHelper = class helper for TSomethingEnumerator
      procedure __TSomethingEnumeratorHelper();
   end;

implementation

procedure TSomethingEnumeratorHelper.__TSomethingEnumeratorHelper();
begin
   WriteLn(self.Current.QualifiedClassName());
end;

end.
Und folgendes Progrämmchen:

Delphi-Quellcode:
program Project3;

uses
  System.SysUtils,
  Unit3 in 'Unit3.pas';

var
   bytes: TBytes;
begin
   bytes.__TSomethingEnumeratorHelper(); // << compiles
end.

TEnumerator<T> ist nur ein Beispiel. Wichtig ist dass "TSomethingEnumerator" ein Alias für etwas generisches ist. Dann wird der Helper auf alles generische angewendet! TBytes ist ja beispielsweise auch nur
Delphi-Quellcode:
TArray<TBytes>
.

Verrückt. Kann ich das irgendwie verhindern? Ist das in späteren Delphi-Versionen behoben?

TiGü 15. Mai 2019 11:05

AW: Class helper wird angewendet obwohl er es nicht sollte
 
Kompiliert so wie du es schreibst in 10.2.3 Tokyo zumindest nicht.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit1 in 'Unit1.pas';

var
   bytes: TBytes;
begin
   bytes.__TSomethingEnumeratorHelper(); // << [dcc32 Error] Project1.dpr(14): E2018 Record, object or class type required
end.

TiGü 15. Mai 2019 11:08

AW: Class helper wird angewendet obwohl er es nicht sollte
 
Nachtrag:
Tatsächlich, in XE6 ging das noch! Schräg! :shock:
Jetzt aber mal wirklich updaten Günni!

Neutral General 15. Mai 2019 11:13

AW: Class helper wird angewendet obwohl er es nicht sollte
 
10.0: Kompiliert.
10.3.0: E2018 Record, Objekt oder Klassentyp erforderlich

Der schöne Günther 15. Mai 2019 11:19

AW: Class helper wird angewendet obwohl er es nicht sollte
 
Zitat:

Zitat von TiGü (Beitrag 1432270)
Jetzt aber mal wirklich updaten Günni!

Ja sollte ich wirklich mal ... 😓

Stevie 15. Mai 2019 12:40

AW: Class helper wird angewendet obwohl er es nicht sollte
 
Seit 10.1 gefixt - siehe:
https://quality.embarcadero.com/browse/RSP-13547
https://quality.embarcadero.com/browse/RSP-13574

Der schöne Günther 15. Mai 2019 16:45

AW: Class helper wird angewendet obwohl er es nicht sollte
 
Niemals zuvor war eine Frage vollständiger und endgültiger beantwortet 👍

Aber es gibt keinen Workaround das irgendwie zu "verhindern" dass so etwas kompiliert, oder? (Außer updaten)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 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