"Konstanter Ausdruck erforderlich" bei Optional-Parameter

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DeltaForce.

    "Konstanter Ausdruck erforderlich" bei Optional-Parameter

    Hallo!

    Ich hoffe, dass ich gerade einfach nur zu blöd bin, um die Antwort auf mein Problem selbst zu finden...

    Ich habe folgenden Code:
    (Klasse myClass hat im Konstruktor einen Byte-Array und einen einfachen Byte-Wert)

    VB.NET-Quellcode

    1. Private myDummy As myClass = New myClass({0}, 0)
    2. Public Sub mySub(Optional ByVal arg1 As Boolean = True, Optional ByVal arg2 As myClass = myDummy)
    3. [...]
    4. End Sub


    Das Problem: Die IDE unterringelt mir immer das "myDummy" in der Signatur der Methode und spuckt mir die Meldung "Konstanter Audruck erforderlich" aus.

    Woran liegt das?
    Ich komme beim besten Willen nicht drauf, was daran nicht passt.

    Freue mich auf hilfreiche Antworten,

    Delta
    Es ist halt genau, wie die Fehlermeldung sagt: Optionale Parameter kann man nur mit einem konstanten ausdruck festlegen.

    arg2 As myClass = myDummy ist aber etwas, was erst noch berechnet werden muß.

    Das hat technische Gründe

    du musst dich wohl mit Nothing behelfen, was für optionale Parameter eh fast immer die beste Wahl ist.:

    VB.NET-Quellcode

    1. Public Sub mySub(Optional ByVal arg1 As Boolean = True, _
    2. Optional ByVal arg2 As myClass = Nothing)
    3. [...]
    4. End Sub
    @ErfinderdesRades: ob "Nothing" in diesem fall so hilfreich ist fraglich. Da die Klasse in ersten argument erwartet ein Array.
    @TE: wäre sinvoler, wenn du komplette konvertierungen in eine Klasse rein schreibst und beim aufruf übergibst dein String/Bild den du in BytArray konvertieren willst.
    @SystemUnknown: Gegen Nothing hätte ich an der Stelle nichts einzuwenden.
    Wenn sich Private myDummy und Public Sub mySub in der selben Klasse befinden (es geht auch im selben Namespace wenn man myDummy auf Public stellt) kann man die Sub MySub umschreiben:

    VB.NET-Quellcode

    1. Public Sub mySub(Optional ByVal arg1 As Boolean = True, _
    2. Optional ByVal arg2 As myClass = Nothing) 'Wie von ErfinderDesRades
    3. If arg2 Is Nothing Then
    4. 'Verwende myDummy
    5. Else
    6. 'Verwende arg2
    7. End If
    8. End Sub


    Man kann auch

    VB.NET-Quellcode

    1. If arg2 Is Nothing Then
    2. arg2 = myDummy
    3. End If
    4. 'Verwende arg2

    schreiben.
    Dabei sollte man allerdings aufpassen, dass man falls ein Parameter übergeben wird nicht diesen versehentlich überschreibt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    arg2 As myClass = myDummy ist aber etwas, was erst noch berechnet werden muß.

    Ahhh... das ist damit gemeint. OK, dann hab ich das verstanden. Hatte nicht gerafft, was jetzt mit "konstantem Ausdruck" gemeint ist.
    Großes Dankeschön! :)

    Die Idee mit Nothing - nun, offenbar hätte es gereicht, wenn ich ne Nacht drüber geschlafen hätte, dann wär ich auch auf Nothing gekommen :D Ist hier natürlich die beste Wahl.
    Und somit @ System Unknown: Nothing ist hier wirklich die beste Wahl, da, wenn der Benutzer der Methode selber kein zweites Argument angibt, dieses sowieso nicht gebraucht wird.

    @TE: wäre sinvoler, wenn du komplette konvertierungen in eine Klasse rein schreibst und beim aufruf übergibst dein String/Bild den du in BytArray konvertieren willst.

    Was du damit meinst, habe ich nicht ganz verstanden... Ich verstehe nicht, wie du auf Konvertierungen kommst?


    @ Niko Ortner: Das wäre eine Möglichkeit. Da ich das Argument aber sowieso nicht brauche, wenn der Benutzer es nicht ändert (myDummy war hier nur als Platzhalter gedacht, aber wenn ich Nothing verwende, brauche ich die ganze Variable myDummy garnicht).

    Und da das erste Argument (der Boolean) angibt, ob das zweite Arg nun gebraucht wird oder nicht, lasse ich eh nach dem arg1 abfragen und nicht nach dem Umstand, ob arg2 = Nothing. Aber das ist ja eh alles nur noch Feinheiten.

    Mein Problem war, dass ich nicht auf die Idee kam, Nothing zu verwenden. Damit hat sich dann die Frage jetzt geklärt ;)