Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Verhalten von String.Join bzgl. Array of Const Parameter (https://www.delphipraxis.net/206107-verhalten-von-string-join-bzgl-array-const-parameter.html)

darktrym 19. Nov 2020 13:36

Delphi-Version: 10.2 Tokyo

Verhalten von String.Join bzgl. Array of Const Parameter
 
Hallo zusammen,
ich hätte eine Frage, ist folgendes Verhalten seitens Sprachdesign eigentlich erwünscht oder irgendwo dokumentiert?
In meinem Delphi 10.2 Programm wird beim Array of Const für String.Join impliziert der Typ gewandelt.
Ist eine Typumwandlung machbar, tut er das auch und liefert dann anschließend ein Compilerfehler!:shock:
Man erwartet offensichtlich explizit Strings wie in der Dokumentation beschrieben ist.

Also, statt String.Join(';', ['A', '1', 'C']) zu schreiben muss man String.Join(';', ['A', String('1'), 'C']) schreiben!?
Ebenso wenn man ihm Shortstrings gibt, dann taucht plötzlich das Wort 'unknown' im Rückgabewert auf.:roll:

Der schöne Günther 19. Nov 2020 14:04

AW: Verhalten von String.Join bzgl. Array of Const Parameter
 
Also wenn ich schreibe
Delphi-Quellcode:
String.Join(';', ['A', '1', 'C']);
kreidet er mir das an:

Code:
[dcc32 Error] Project1.dpr(10): E2251 Ambiguous overloaded call to 'Join'
  System.SysUtils.pas(4112): Related method: class function TStringHelper.Join(const string; const array of const): string;
  System.SysUtils.pas(4113): Related method: class function TStringHelper.Join(const string; const array of string): string;
Heißt: Er weiß nicht, welche Überladung er nehmen soll.

Mit so etwas ist er dann happy:

Delphi-Quellcode:
   const args: TArray<String> = ['A', '1', 'C'];
   var myText := String.Join(';', args);

himitsu 19. Nov 2020 17:58

AW: Verhalten von String.Join bzgl. Array of Const Parameter
 
k.A. wer auf die schwachsinige geniale Idee kam, aber der WideChar wurde im string.Join vergessen.
> 'x' mit nur einem Zeichen ist ein Char (WideChar)
> und bei mehr oder weniger/keinem Zeichen ist es ein String (UnicodeString)

Außer im NEXTGEN (wo es hier garkeine Chars gibt), wurde nur vtChar und vtPChar implementiert, was aber die AnsiChar und PAnsiChar sind,
wobei der Compiler aber deine 'Zeichen' als WideChar übergibt. :roll:

Ebenso darfst du keine AnsiString, WideString, PWideChar, Variant oder ShortString verwenden,
siehe ValueToString im TStringHelper.Join
und alles was diese Funktion nicht kennt, wird mit "(Unknown) : %d" beantwortet.
Und es gibt keinen vernünftigen Grund, warum diese 5 Zeilen Code weggelassen wurden.
(die Codevervollständigung füllt Einem schließlich das CASE und es ist mehr Aufwand jenes geziehlt wegzulassen)


Fazit: Einzelne Zeichen mußt du entweder nach String oder AnsiChar casten,
oder warten bis in 1-5 Jahren der Fehler behoben wurde, nachdem du ihn gemeldet hast.



Fun-Fact: entweder nutzt sonst niemand das Join oder es kam viele Jahre lang noch niemand auf die Idee einzelne Char-Konstanten reinzugeben.


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