Salve a tutti,
scrivo in VB da sempre, e talvolta ho problemi a "ragionare" in c#...
ora ad esempio ho un problema a "tradurre" il mio pensiero da VB a c#..
in VB posso scrivere un event handler delegato a gestire piu' controlli, tipo
Private Sub tStripButtons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tStripButEnd.Click, tStripButSave.Click, .....

        If CType(sender, ToolStripButton).Enabled Then
            Select Case True
                Case CType(sender, ToolStripButton) Is Me.tStripButEnd
                    Me.Close()
                Case CType(sender, ToolStripButton) Is Me.tStripButSave
                    SaveData()
                Case ....
            End Select
        End If

    End Sub


dove all'interno dell'evento verifico QUALE button sia stato premuto....

ho provato in c# a scrivere
private void tStripButtons_Click(object sender, EventArgs e)
{

    ToolStripButton button = sender as ToolStripButton;
    if (button != null && button.Enabled && button.Visible)
    {
        switch (true) 
        {
            case (button == this.tStripButXXX):     // errato per "a costant value is expected"
                break;

            case (button is this.tStripButXXX):     // errato per "a costant value is expected"
                break;

            case (sender as ToolStripButton == this.tStripButXXXX): // errato per "a costant value is expected"
                break;

        }
    }
}


e non mi e' affatto chiaro il problema di "a costant value is expected"...
il converter on line di Telerik converte vb in
    ...
    switch (true)
    {
        case object _ when (ToolStripButton)sender == this.tStripButEnd:
            {
                this.Close();
                break;
            }

        case .....


innanzitutto ci ho messo un po' a capire che "_" era il nome della variabile di tipo object, poi, ok, ho capito il senso della clausola "when" per aggiungere al match la condizione che a me effettivamente interessa, " ... when (ToolStripButton)sender == this.tStripButEnd", che risolve il match...

comprendo che il pattern matching di switch sia diverso da SELECT CASE, ma non riesco per comprenderne bene la motivazione...
tendenzialmente
case (ToolStripButton)sender == this.tStripButEnd:
dovrebbe essere sufficiente, ma a quanto pare ancora NON ho capito il "perche'" non vada bene... da language specification, il "when" aggiunto dovrebbe essere una "seconda" condizione addizionale (aggiunto in c# 7.0)...

qualche anima pia mi spiega il senso??

la sinossi di switch recita:
switch is a selection statement that chooses a single switch section to execute from a list of candidates based on a pattern match with the match expression.
case (button == this.tStripButXXX): dovrebbe risolvere il match, no?

leggo
"Because C# 6 supports only the constant pattern and doesn't allow the repetition of constant values, case labels define mutually exclusive values, and only one pattern can match the match expression. As a result, the order in which case statements appear is unimportant."
forse il mio problema risiede proprio nel constant pattern, dove si richiede forse che { button == COSTANTE_e_non_riferimento_a_istanza_di_qualche_cosa } ??
ho visto che se scrivo una schifezza tipo
case (1 == 1) when button == this.tStripButEnd:{...}
il compilatore non disdegna:
1) (1 == 1) -> risolve il basilare match di constant pattern
2) when button == this.tStripButEnd -> risolve la valutazione del "mio problema"

ho capito correttamente??
ma e' veramente una schifezza!!! :D
c'e' un modo piu' "serio e civile" che soddisfi la mia condizione??

salutoni e grazie

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.