Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1

    [C#] overload "al contrario" ...

    scusate il titolo, forse strano, ma è l'unico sunto che m'è venuto in mente per questo problema.

    In pratica con l'overload posso definire più metodi che in base al parametro in ingresso si comportano diversamente ... io ho il problema contrario: il parametro di ingresso sarà sempre stringa, il tipo di ritorno deve essere invece differente a seconda del contenuto della stringa.

    La soluzione adottata fino ad ora è stata quella di utilizzare un object come tipo di ritorno, abbastanza universale, essendo la super classe "di tutti", ma c'e' qualcuno che sfugge a questa norma: Hashtable.


    codice:
    public object stringToSomething(string s) {
    	object result;
    	switch(s) {
    		case "1":
    			result = System.Convert.ToInt32(s);
    			break;
    		default:
    			result = new System.Collections.Hashtable();
    			break;
    	}
    	return result;
    }

    ora sebbene questo esempio faccia schifo e sebbene potrebbe anche andare (visto che il problema che ho è poi e non qui) se ho una variabile di tipo object non riesco ad assegnarla come Hashtable.

    object test = stringToSomething("hashtable");

    che se stampata mi dirà si che è una System.Collections.Hashtable ma se gli assegno un indice ed un valore (dentro la funzione, non fuori) e provo a stampare
    test[0]
    mi dirà che l'oggetto test non può avere l'indice 0

    mentre aggiungendo a mano, per esempio, la stampa di result[0] nello switch, non esistono problemi.

    Come se castasse in fase di ritorno, non so ... il punto di tutto è:

    che tipo di ritorno dovrei assegnare per avere un dato non definito come tipo in ritorno funzione ???

    spero di essermi spiegato

    grazie a tutti
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Hashtable test = (Hashtable)stringToSomething("hashtable");


  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Re: [C#] overload "al contrario" ...

    Originariamente inviato da andr3a
    che tipo di ritorno dovrei assegnare per avere un dato non definito come tipo in ritorno funzione ???
    A mio avviso, la scelta di System.Object è corretta; probabilmente, commetti qualche errore nell'operazione di "casting" dell'oggetto restituito.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4

    Re: Re: [C#] overload "al contrario" ...

    Originariamente inviato da alka
    A mio avviso, la scelta di System.Object è corretta; probabilmente, commetti qualche errore nell'operazione di "casting" dell'oggetto restituito.

    Ciao!
    anche perché l'unico altro modo, credo, sarebbe di lavorare con unsafe e restituire il pointer dell'oggetto ... solo che no ne vale la pena dato che si può ottenere lo stesso identico risultato senza avere un calo abbissale delle performance dovuto all'unsafe e al marshalling ^^

  5. #5
    Originariamente inviato da daniele_dll
    Hashtable test = (Hashtable)stringToSomething("hashtable");

    no, non posso sapere a priori se sarà un hashtable o meno.

    la funzione deve poter ritornare un tipo di dato, un generico object, in questo caso.

    Il tipo di dato non può essere "diverso" .

    faccio un esempio più concreto:
    codice:
    // funzione per far tornare una hashtable generica, 
        // tipo di ritorno: System.Collections.Hashtable
        public System.Collections.Hashtable toHashtableFromString()
        {
            // variabile result di tipo System.Collections.Hashtable
            System.Collections.Hashtable result = new System.Collections.Hashtable();
            // assegnazione chiave 0 con valore "test"
            result[0] = "test";
            // stampo la verifica dell' assegnazione, tutto ok
            Response.Write("Hashtable interna: " + result[0] + "<hr />");
            // ritorno il tipo di dato Hashtable
            return result;
        }
        
        // funzione per far tornare un intero da una stringa,
        // tipo di ritorno: int
        public int toIntFromString(string s)
        {
            // torna un intero
            return System.Convert.ToInt32(s);
        }
        
        // funzione per far tornare "qualcosa" che non 
        // è possibile sapere a priori cosa sia, uso
        // il tipo di ritorno generico object
        public object stringToSomething(string s)
        {
            // variabile di ritorno, non sapendo cosa potrà essere
            // la istanzio come tipo generico object
            object result;
            switch (s)
            {
                case "1":
                    // la variabile di ritorno di tipo object
                    // viene assegnata con un intero, tutto OK
                    result = toIntFromString(s);
                    break;
                default:
                    // la variabile di ritorno di tipo object
                    // viene assegnata con una Hashtable ... 
                    // apparentemente tutto ok ... 
                    result = toHashtableFromString();
                    // se qui volessi stampare result[0]
                    // non potrei farlo perchè un object non può
                    // avere un index tipo hashtable ... ma result
                    // di fatto, è un hashtable
                    break;
            }
            // ritorno il tipo di oggetto a seconda
            // di cosa è avvenuto nello switch
            return result;
        }
    
    void Page_Load() {
    // non posso sapere che tipo di dato sarà test, quindi 
        // lo istanzio come oggetto generico
        object test = stringToSomething("1");
        
        // scrivo il valore di test: 1
        Response.Write(test + "<hr />");
        
        // cambio test (o non lo cambio, è uguale ...)
        // gli assegno una stringa diversa da uno, mi 
        // aspetto un hashtable in ritorno
        test = stringToSomething("Hashtable");
        // a video ho la stampa del valore della hashtable 
        // interna, prima di tornare dalla funzione toHashtableFromString
        // tutto regolare
        
        
        // stampo la variabile test, mi aspetto un' hashtable
        // risposta a video: System.Collections.Hashtable
        // tutto apparentemente regolare
        Response.Write(test + "<hr />");
        
        
        // non posso però stampare il valore interno, 
        // in pratica ho una hashtable inutilizzabile ...
        // Response.Write("Hashtable esterna: " + test[0] + "<hr />");
        // Compiler Error Message: CS0021: 
        // Cannot apply indexing with [] to an expression of type 'object'
    }



    Originariamente inviato da alka
    probabilmente, commetti qualche errore nell'operazione di "casting" dell'oggetto restituito.
    il casting è implicito (quindi casomai l'errore non è mio) ... non avrei postato il quesito altrimenti
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da andr3a
    no, non posso sapere a priori se sarà un hashtable o meno.
    Certo, ma puoi verificare se l'oggetto restituito è un'istanza di Hashtable e, in caso affermativo, effettuare il "cast" e accedere ai membri specifici di quell'oggetto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Originariamente inviato da alka
    Certo, ma puoi verificare se l'oggetto restituito è un'istanza di Hashtable e, in caso affermativo, effettuare il "cast" e accedere ai membri specifici di quell'oggetto.
    ok ... ma se io volessi far tornare esattamente quel tipo di dato, senza ricastare, non è possibile fare, appunto, un overload al contrario, di una funzione che ritorna, in base alle proprie operazioni interne, esattamente il tipo di dato specificato ?

    int nel caso di 1
    e
    hashtable nel caso di tutto tranne 1 ???


    in pratica vorrei automatizzare anche l'ultimo casting ... ma penso, a questo punto, non sia possibile.

    Esiste un metodo di qulche classe in grado di fare questa operazione in automatico ?

    tipo:

    test = test.ToInstance();

    al fine di non dover fare un ulteriore switch sul tipo fuori dal ritorno in funzione ???



    [edit]
    in pratica, se io non posso fare questo:
    int test = System.Convert.ToInt32(stringToSomething("1"));

    perchè non so di fatto che tipo di stringa ho ricevuto ... sono fregato, giusto ?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    allora ... forse ci sono, l'overload al contrario me lo creo ...

    codice:
    public int stringToSomething(object i) {
            return System.Convert.ToInt32(i);
    }
    così facendo dovrei avere in automatico l' intero ...


    int test = stringToSomething(stringToSomething("1"));

    overload della funzione, intero assegnato ... ma ...


    public int stringToSomething(object i) {

    questo continua a vincolarmi .... quindi ultima domanda, poi mi vado a buttare dalla finestra ... se io ho un object di tipo int, posso sfruttare la funzione con l'istanza e non con il tipo di dato ???

    nel senso ...

    public int stringToSomething(int i) {}

    se gli passo un
    object i = 3;
    stringToSomething(i); // errore

    ma i è type object ma istance of Int32 ... o no ????


    scusatemi, è il secondo giorno che testo C# e mi sa che son partito con una cosa troppo bastarda (deserializzazione di stringa formato PHP)


    [ alchè mi studio i sorgenti di JSON mi sa ... se c'è per C# ... tanto loro devono esserci riusciti ]
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da andr3a
    ok ... ma se io volessi far tornare esattamente quel tipo di dato, senza ricastare, non è possibile fare, appunto, un overload al contrario, di una funzione che ritorna, in base alle proprie operazioni interne, esattamente il tipo di dato specificato?
    L'operazione di overload non è reversibile nel modo in cui lo intendi tu per ovvi motivi: se io appoggiassi in una variabile di tipo Object il valore di ritorno della funzione supponendo che questa possa effettivamente avere più di un tipo di valore di ritorno, tutte le versioni disponibili di tale funzione andrebbero bene nel caso in esame, quindi il compilatore non sarebbe in grado di determinare quale di queste utilizzare.

    Detto questo, se vuoi restituire diversi tipi di oggetti, non ti rimane che usare Object come valore di ritorno e, all'interno della funzione, restituire l'istanza dell'oggetto appropriato a seconda dei casi che dipendono dal problema che devi risolvere.

    A questo punto, è un dato di fatto che il tipo di dato restituito dalla funzione, come nel tuo caso specifico, è determinabile solo a runtime perchè dipende dal parametro passato, quindi non puoi chiedere al compilatore C# di accettare codice che fa un uso esplicito del valore di ritorno come se fosse un Hashtable quando non è detto che l'oggetto restituito appartenga a questo tipo.

    Certo, se tu potessi fare un overload in modo tale per cui tu possa avere diversi tipi di valori di ritorno, il problema sarebbe risolto, ma questo non è possibile, non per una limitazione del linguaggio, ma per la condizione descritta all'inizio.

    Poi, per trovare la soluzione più adatta al tuo problema per il quale hai deciso di implementare la funzione nel modo che hai descritto, si dovrebbe conoscere meglio l'esigenza effettiva che stai cercando di risolvere.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    creare un'eventuale serializzatore e muoversi tramite quello e la serializzazione di oggetti potrebbe permettergli di fare quello che vuole

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.