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