Funzioni locali e switch/case - C#

di il
10 risposte

Funzioni locali e switch/case - C#

Buona sera a tutti, sono nuovo di questo forum e già mi scuso se commetterò errori. Mi chiamo Christian e non sono nuovo al linguaggio C# ma sono per la prima volta mi sono imbattuto in un problema con una funzione locale che presenta al suo interno un'istruzione "Switch/case".
Credendo di scrivere correttamente il codice, come faccio di solito quando mi trovo all'interno del main, ho inserito nella funzione locale l'istruzione sopra citata ma ricevo l'errore secondo il quale
la funzione locale non restituisce un valore
e non capisco per quale motivo. Ho provato anche a guardare esempi in giro ma non ho trovato nulla di idoneo.
Posto qui il frammento di codice interessato:

private double Conversione(string dato)
        {
            double valore;
            int k = comboBox2.SelectedIndex;

            switch (k)
            {
                case 1:
                    valore = Convert.ToInt16(dato) / 25;
                    break;
                case 2:
                    valore = Convert.ToInt16(dato) / 25;
                    break;
            }

            return valore;
        }
Qualcuno è in grado di dirmi quale errore sto commettendo? Ringrazio tutti anticipatamente. Christian

10 Risposte

  • Re: Funzioni locali e switch/case - C#

    E' molto semplice: se la variabile k fosse ad esempio impostata a 3, non verrebbe eseguito nessuno dei rami del costrutto switch, quindi di fatto non verrebbe valorizzata la variabile valore: non assegnandole un valore esplicitamente, non sarebbe possibile determinare quale viene restituito all'uscita della funzione, motivo per cui il compilatore ti segnala la condizione.

    Ciao!
  • Re: Funzioni locali e switch/case - C#

    Grazie mille Alka per la chiara e veloce risposta! Sinceramente, però, continuo a non avere le idee chiare. Da quello che ho capito, se la funzione riceve un valore (es. k = 3) che non si trova tra le etichette dello switch allora il programma non entra nel costrutto e quindi non si ha alcuna assegnazione alla variabile valore. Se aggiungo, però, al costrutto anche l'etichetta default con l'assegnazione di un qualche valore a valore allora il costrutto dovrebbe essere completo e restituire sempre un risultato. Ho provato a muovermi in questa direzione ma nuovamente il risultato non cambia. Ti sarei grato potessi ancora colmare questo mio dubbio perché vorrei evitare di utilizzare un grande numero di if (sempre che in questo modo funzioni). Ancora ti ringrazio e mi scuso per il disturbo! Christian
  • Re: Funzioni locali e switch/case - C#

    Posta il codice perché probabilmente nell'etichetta default c'è qualcosa che manca. :/
  • Re: Funzioni locali e switch/case - C#

    Ancora ti ringrazio della disponibilità!
    Ecco il codice con l'etichetta default:
    
    private double Conversione(string dato, int j)
            {
                double valore;
                int k = comboBox2.SelectedIndex;
                
                switch (k)
                {
                    case 1:
                        valore = Convert.ToInt16(dato) / 20;
                        break;
                    case 2:
                        valore = Convert.ToInt16(dato) / 25;
                        break;
                    case 3:
                        break;
                    default:
                        valore = Convert.ToInt16(dato) / 30;
                        break;
                }
    
                return valore;
            }
    
    Ho fatto cose ben peggiori ma questo caso mi sta lasciando molto perplesso ... :/

    Christian
  • Re: Funzioni locali e switch/case - C#

    Non hai assegnato un valore nel ramo dove k == 3.
  • Re: Funzioni locali e switch/case - C#

    christian.rigardo ha scritto:


    Ancora ti ringrazio della disponibilità!
    Ecco il codice con l'etichetta default:
    
    private double Conversione(string dato, int j)
            {
                double valore;
                int k = comboBox2.SelectedIndex;
                
                switch (k)
                {
                    case 1:
                        valore = Convert.ToInt16(dato) / 20;
                        break;
                    case 2:
                        valore = Convert.ToInt16(dato) / 25;
                        break;
                    case 3:
                        break;
                    default:
                        valore = Convert.ToInt16(dato) / 30;
                        break;
                }
    
                return valore;
            }
    
    Ho fatto cose ben peggiori ma questo caso mi sta lasciando molto perplesso ... :/

    Christian
    Scusa ma è un caso banale che non ti può lasciare perplesso.

    La variabile valore deve avere sempre un valore valido quindi bastava controllare quando non lo assegni (caso 3)

    Potresti assegnare un valore sin dall'inizio per evitare problemi
  • Re: Funzioni locali e switch/case - C#

    Grazie mille Alka, avevo scordato di togliere l'etichetta k=3 e quindi non mi rendevo conto che nuovamente c'era una via che non restituiva. Ora funziona infatti. Grazie per la pazienza!
    Ps. Gentilissimo Oregon prendi le parole che seguono come una critica costruttiva: "La banalità è vista dagli occhi che comprendono". Se avessi ritenuto il caso banale, a parte l'ultima svista, non avrei avuto problemi a risolverlo e non avrei scritto sul forum.
    Sono un docente delle superiori e mille volte mi è capitato di assegnare compiti che ho ritenuto banali ma che gli studenti a volte non capivano e, visto che ho un credo verso la mia professione, quando mi hanno presentano la perplessità e lo hanno sempre fatto perché ho insegnato loro che non bisogna nascondere un dubbio perché da questo inizia la fine distruttiva di un apprendimento. In questi casi riprendo l'argomento o l'esercizio e ci ragiono con loro ma non mi permetto mai di dire:
    Scusa ma è un caso banale che non ti può lasciare perplesso
    Certo, a ognuno il proprio lavoro. Buona giornata!
  • Re: Funzioni locali e switch/case - C#

    Caro prof mi riferivo all'ultima SVISTA. Il primo dubbio passi ma dire che continua a darti un errore dopo la spiegazione di alka... era quello che non mi tornava. Comunque buon lavoro anche a te e in bocca al lupo ai tuoi alunni che spero non siano di un istituto informatico. Prendi anche questo augurio come costruttivo
  • Re: Funzioni locali e switch/case - C#

    Sì, chimici informatici ed elettronici e ti invito tranquillamente a vedere le mie lezioni e vedresti che i miei studenti non hanno bisogno di un in bocca al lupo anzi ... Mi spiace che la mia replica tu l'abbia presa come un'offesa giudicando la tua ultima risposta!
  • Re: Funzioni locali e switch/case - C#

    No... sei tu che hai preso il mio augurio ai tuoi studenti come un'offesa. Ma è un tuo problema
Devi accedere o registrarti per scrivere nel forum
10 risposte