Laden...

Kombination von optionalen Parametern und params ...[] unmöglich?

Erstellt von 7.e.Q vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.144 Views
7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 13 Jahren
Kombination von optionalen Parametern und params ...[] unmöglich?

Hi Leute,

nochmal 'ne kurze Frage: ist es per definition unmöglich, soetwas zu machen?


public MethodeXY(bool JaNein = true, params string[] Zusaetzliches) ...

_:::

Achso, Info: übersetzen tut das. Nur einen Aufruf a'la


MethodeXY("Hallo", "Welt");

übersetzt der Compiler nicht.


MethodeXY(false, "Test", "Test2"); 

funktioniert nun hingegen. Aber dann kann ich auch auf das Attribut "optional" beim Parameter JaNein verzichten.

Danke!

Grüße,
Hendrik

S
248 Beiträge seit 2008
vor 13 Jahren

Hallo,

der optionale Parameter ist nur dann optional, wenn du weder ihn, noch Parameter rechts von ihm angibst. Da du den Paramter "Zusaetzliches" angibst, musst du auch "JaNein" angeben (in vb kann man glaube ich, auch optionale Parameter in der Mitte weglassen).
Was funktionieren würde, wäre gar keinen Parameter anzugeben.

spooky

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 13 Jahren

... und da auch nach params nichts mehr kommen darf, schließen sich diese beiden Mechanismen quasi gegenseitig aus. Man hat dadurch lediglich, wie du bereits erwähnt hast, einen Weg, parameterlose Aufrufe zu ermöglichen, ohne eine entsprechende Überladung implementieren zu müssen.

Schade...

U
1.578 Beiträge seit 2009
vor 13 Jahren

Soweit ich weiß gibt es in C# keine optionalen Parameter.
Was du tun kannst ist einfach die Methode zu überladen

public MethodeXY(params string[] Zusaetzliches)
{
    MethodeXY(true, Zusaetzliches)
}
public MethodeXY(bool JaNein, params string[] Zusaetzliches)
{
}
3.511 Beiträge seit 2005
vor 13 Jahren

Soweit ich weiß gibt es in C# keine optionalen Parameter.

Dann weißt du was neues seit Heute 😃
Die optionalen Parameter kommen mit dem .NET 4.0 für c# mit. Man sollte diese aber nicht unbedingt verwenden. Ich würde bei überladenen Methoden bleiben.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

F
240 Beiträge seit 2006
vor 13 Jahren

Mit C#4.0 gibt es optionale Parameter, allerdings dürften sich die Konzepte (params[] und optional) durch die verschiedenen Einschränkungen ausschließen.

5.941 Beiträge seit 2005
vor 13 Jahren

Hallo zusammen

Man sollte diese aber nicht unbedingt verwenden. Ich würde bei überladenen Methoden bleiben.

Ja, schaut dazu mal hier:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

742 Beiträge seit 2005
vor 13 Jahren

Eigentlich sollte es in diesem Fall zumindest theoretisch möglich sein, habs aber auch nicht hinbekommen. Hier ist die Zuordnung ja noch eindeutig.

Hätte die Methode aber folgende Signatur:


public MethodeXY(bool JaNein = true, params object[] Zusaetzliches) ...

Wäre z.B. der folgende Aufruf


MethodXY(true, true);

nicht eindeutig.

Ansonsten hat Spook natürlich Recht, Optionale Parameter müssen immer am Schluss sein. Mit benannten Parametern hat man aber trotzdem im Gegensatz zu C++ z.B. die Möglichkeit beliebige Parameter zu verwenden.

So oder so finde ich optionale Parameter eine Krankheit und eigentlich auch ziemlich traurig (zumindest als Java Entwickler hätte ich einen weiteren Grund bei Java zu bleiben), aber das nur am Rande.

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 13 Jahren

Man sollte diese aber nicht unbedingt verwenden. Ich würde bei überladenen Methoden bleiben.
Ja, schaut dazu mal hier:

Aufschlussreicher Beitrag. Sehe ich das also richtig, dass man optionale Parameter relativ problemlos verwenden kann (trotzdem wohl nicht sollte), wenn man sich in einer abgeschlossenen Anwendungsumgebung bewegt, sprich, keine Exports/APIs vorgesehen sind?

742 Beiträge seit 2005
vor 13 Jahren

Du kannst optionale Parameter dann problemlos verwenden, wenn deine Anwendung abgeschlossen ist und nur aus einer Solution besteht.

Wenn du komponentenorientiert arbeitest und deine Anwendung wie hier aus 100 Solutions bestehst, hast du natürlich das gleiche Problem.

Ich mag mir gar nicht vorstellen, was da alles passieren kann, wenn man nicht daran denkt...

328 Beiträge seit 2006
vor 13 Jahren

Hätte mal eine Frage bez. optionale parameter, ist zwar leider Offtopic aber ich wollte kein neues Thema erstellen.

Und zwar entwickle ich gerade mit VS2010 ein .NET 3.5 Projekt und habe dort eine Methoden mit optionale Parameter bestückt. Optionale Parameter gibt es ja erst seit .NET4, warum kann ich diese aber unter .NET 3.5 bereits verwenden ohne dass der Compiler meckert?

Und jetzt will ich auch noch was zum Thema beizutragen. Und zwar habe ich das Problem mal angeschaut und folgendes funktioniert:

 public Test()
        {
            MethodeXY(Zusaetzliches:new string[] { "Test1", "Test1" });
        }

        public void MethodeXY(bool JaNein = true, params string[] Zusaetzliches)  {
            if (JaNein)
            {
                foreach (string item in Zusaetzliches)
                {
                    Console.WriteLine(item);
                }
            }
        }

Also verwenden kann man das auch mit optionale Parameter, man muss halt die Parameter in ein array packen.

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

742 Beiträge seit 2005
vor 13 Jahren

@TripleX: Ja das funktioniert, aber so verwendest du Parameterlisten ja nicht wie gedacht, sondern also normales Array.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo TripleX,

warum kann ich diese aber unter .NET 3.5 bereits verwenden ohne dass der Compiler meckert?

weil das ein reines Compiler-Feature ist. Die Runtime und erst recht das Framework haben damit gar nichts zu tun.

herbivore

328 Beiträge seit 2006
vor 13 Jahren

weil das ein reines Compiler-Feature ist. Die Runtime und erst recht das Framework haben damit gar nichts zu tun.){gray}

Und deswegen sollte man auch auf die Verwendung von optionalen Paramter verzichten wenn man kein .NET 4 projekt bastelt - denn wenn jemand anders dieses Projekt kompilieren möchte und nicht mit VS2010 sondern nur mit VS2008 arbeitet, wird es zu Problemen kommen? (man sollte die optionalen Parameter ja eh mit Vorsicht genießen, wie oben schon beschrieben)

Träume nicht dein Leben sondern lebe deinen Traum.
Viele Grüße, David Teck

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo TripleX,

richtig, mit VS vor 2010 würde sich der Code nicht übersetzen lassen.

herbivore