Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Błąd we frameworku?

0 views
Skip to first unread message

bodziec

unread,
Nov 20, 2009, 3:21:22 AM11/20/09
to
Mam klase

public class Klasa : KlasaBazowa
{
public override void SetUp()
{
base.SetUp();

// cośtam dalej
}

public void SetUp(params int[] tab)
{
this.SetUp();

//costam dalej
}
}

Okazuje się że przy takiej strukturze nie da się wywołać metody SetUp
()
Program zawsze będzie wywoływał metodę z params wstawiając tablicę o
zerowej długości

Jak myślicie: Czy to jest błąd frameworka czy poprostu "tak ma być"?
Wg. mnie to jest błąd bo przy dziedziczeniu powoduje że kod trzeba
pisać pod tą konkretną sytuację co powoduje że robi się śmietnik

Pozdrawiam i czekam na Wasze opinie

bodziec

unread,
Nov 20, 2009, 4:20:13 AM11/20/09
to

Zauważyłem że takie zachowanie występuje tylko gdy mamy do czynienia z
override metody.
Jeżeli będziemy mieli po prostu metodę SetUp() która należy tylko do
danej klasy to już chodzi ok

co ciekawe także kod:

public class Klasa : KlasaBazowa
{
public void Metoda()
{
base.Metoda();
}

public void Metoda(params int[] liczba)
{
this.Metoda();
}

public void Metoda(params string[] napisy)
{
this.Metoda();
}
}

przejdzie bez problemu ale jak damy override to kompilator zgłasza
błąd

public class Klasa : KlasaBazowa
{
public override void Metoda()
{
base.Metoda();
}

public void Metoda(params int[] liczba)
{
this.Metoda();
}

public void Metoda(params string[] napisy)
{
this.Metoda();
}
}

jeżeli uważacie że to błąd to jak się to zgłasza do MS?
wszedłem na stronę connect.microsoft.com ale jakoś nie mogę się tam
połapać

Wiktor Zychla

unread,
Nov 22, 2009, 12:27:59 PM11/22/09
to
> Jak my�licie: Czy to jest b��d frameworka czy poprostu "tak ma by�"?
> Wg. mnie to jest b��d bo przy dziedziczeniu powoduje �e kod trzeba

po pierwsze - je�li to by�by b��d, to nie frameworka, tylko kompilatora C#.
to kompilator na etapie kompilacji rozstrzyga, metodďż˝ o jakiej sygnaturze
mia�e� zamiar wywo�a�.

tu akurat moim zdaniem to nie jest b��d, tylko konsekwencja zasady, zgodnie
z kt�r� metoda z klasy ma, przy dopasowaniu "bezstratnym", pierwsze�stwo
przy wywo�ywaniu nad metodami z klasy macierzystej o nawet lepszej
sygnaturze. ponadto trafiasz na problem, w kt�rym "params int[]" dopasowuje
siďż˝ do listy pustej.

ja bym to rozwi�za� tak: zmieni�bym sygnatur� tej metody z "params" na tak�

public void SetUp(int[] tab)
{
}

to co prawda utrudnia wywo�anie, bo trzeba w miejscu wywo�ania utworzy�
jawnie tablic�, ale pami�taj, �e po pierwsze "params" to i tak cukier
syntaktyczny, kt�ry rozwija si� do takiego wywo�ania z tablic�, a po
drugie - taka definicja przestaje konfundowa� kompilator, bo wywo�anie z
pustďż˝ tablicďż˝ to SetUp( null ), a bez tablicy - SetUp().

pozdrawiam
Wiktor Zychla

bodziec

unread,
Nov 23, 2009, 4:09:45 AM11/23/09
to
On 22 Lis, 18:27, "Wiktor Zychla" <u...@nospam.com.eu> wrote:
> > Jak myślicie: Czy to jest błąd frameworka czy poprostu "tak ma być"?
> > Wg. mnie to jest błąd bo przy dziedziczeniu powoduje że kod trzeba
>
> po pierwsze - jeśli to byłby błąd, to nie frameworka, tylko kompilatora C#.
> to kompilator na etapie kompilacji rozstrzyga, metodę o jakiej sygnaturze
> miałeś zamiar wywołać.
>
> tu akurat moim zdaniem to nie jest błąd, tylko konsekwencja zasady, zgodnie
> z którą metoda z klasy ma, przy dopasowaniu "bezstratnym", pierwszeństwo
> przy wywoływaniu nad metodami z klasy macierzystej o nawet lepszej
> sygnaturze. ponadto trafiasz na problem, w którym "params int[]" dopasowuje
> się do listy pustej.
>
> ja bym to rozwiązał tak: zmieniłbym sygnaturę tej metody z "params" na taką
>
> public void SetUp(int[] tab)
> {
>
> }
>
> to co prawda utrudnia wywołanie, bo trzeba w miejscu wywołania utworzyć
> jawnie tablicę, ale pamiętaj, że po pierwsze "params" to i tak cukier
> syntaktyczny, który rozwija się do takiego wywołania z tablicą, a po
> drugie - taka definicja przestaje konfundować kompilator, bo wywołanie z
> pustą tablicą to SetUp( null ), a bez tablicy - SetUp().
>
> pozdrawiam
> Wiktor Zychla

no tak faktycznie mógłby być to błąd kompilatora a nie frameworka

zastanawia mnie jednak dlaczego kompilator uznaje w tym momencie oba
wywołania za jednoznaczne
SetUp() == SetUp(null)

wydaje mi się to nielogiczne

0 new messages