Niejawna tablica przekazywana w argumentach

0

Czy istniej możliwość deklaracji czegoś takiego?

Dam przykład w Java.

void x(String...arg1) {}

Przykładowe wywołanie:

x("", "", "");

W efekcie, metoda 'x', dostaje tablicę.

1
grzesiek51114 napisał(a):

http://cezarywalenciuk.pl/blog/programing/post/params-tablica-parametrow-w-metodach

W artykule jest kilka nieścisłości.

public static int LongestStringLenght(int a,params string[] paramList)
public static int LongestStringLenght(params string[] paramList)

Jednak o dziwo kompilator nie ma problemów z tym kodem, który też jest błędny.

Nie widzę w tym kodzie nic błędnego, poza błędem w pisowni “Length”. Nie ma możliwości, by wywołanie funkcji było niejednoznaczne, bo string nie jest intem.

public static int LongestStringLenght(string a,params string[] paramList)

To przeciążanie metody nie jest właściwe i niszczy działanie słowa kluczowego. Od tej pory tylko ta wersja będzie się wykonywać. Kompilator powinien zgłosić błąd w końcu nie powinien być pewien, której wersji metody ma użyć ,ale o dziwo tak nie jest. Kompilator zdecydował używać zawsze tej wersji. No chyba ,że podam bezpośrednio tablice do metody.

Niczego nie niszczy. Pierwszy podany string wejdzie jako string a, reszta jako string[] paramList. Kompilator użyje tego przeciążenia jeśli pasuje do podanych parametrów i to nie jest żadne „dziwo”.

public static int LongestStringLenght(string a,string b)

Kompilator po raz kolejny nie zgłosi błędu. W tym wypadku jeśli metoda nie przyjmuje dokładnie dwóch argumentów stringzostanie wykonana wersja z params .To zachowanie jest niespójne,bo co jeśli jak chcę wykonać metodę paramsz dwoma parametrami string ,a przecież właśnie tego nie mogę zrobić. Jest to kolejny błąd. Nie ma tutaj spójności zachowania.

I znowu autor próbuje być mądrzejszy od twórców kompilatora, i wymyśla nieistniejące „niespójności”. Sygnatura (string, string) ma pierwszeństwo przed params string[], i dla dwóch stringów wykonana zostanie ta pierwsza.

Zostało to wykorzystane w metodzie System.Console.WriteLine(), która między innymi ma takie wersje:

public static void WriteLine(string, object)	
public static void WriteLine(string, object, object)	
public static void WriteLine(string, object, object, object)	
public static void WriteLine(string, object, object, object, object)
public static void WriteLine(string, params object[])

W ten sposób dopiero dla stringa i pięciu lub więcej obiektów zostanie zbudowana tablica i przekazana jako params. Cztery lub mniej obiektów będą przekazane bezpośrednio do odpowiedniej wersji metody.

0

No... racja. To public static int LongestStringLenght(string a,params string[] paramList) w sumie zauważyłem od razu dlatego tyle razy modyfikowałem posty, które gdzieś tam wcześniej w podobnym wątku popisałem. Reszcie się tak nie przyglądałem.

0

hmm
Nawet tego nie czytałem, bo interesowała mnie tylko deklaracja. Bardzo intuicyjny język.

1 użytkowników online, w tym zalogowanych: 0, gości: 1