2012-07-13 13 views
5

La mia funzione richiede che tu passi una stringa e un Tipo come T. Basato su T voglio analizzare la stringa val come quel tipo, ma ottengo l'errore dal titolo di questa domanda. Chiunque abbia qualche intuizione o altri modi per realizzare questa funzione, lo apprezzerei molto.Il vincolo non può essere una classe speciale 'System.Object'

T Parse<T>(string val) where T : System.Object 
    { 
     TypeCode code = Type.GetTypeCode(typeof(T)); 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return System.Boolean.Parse(val); 
       break; 
      case TypeCode.Int32: 
       return Int32.Parse(val); 
       break; 
      case TypeCode.Double: 
       return Double.Parse(val); 
       break; 
      case TypeCode.String: 
       return (string)val; 
       break; 
     } 
     return null; 
    } 
+3

Cosa sei fare ci sono generici abusanti. Se stai cercando un tipo, perché usare i generici? – Oded

+0

possibile duplicato di [C# Generics: Vincolare T dove T: Object non si compila; Errore: il vincolo non può essere 'oggetto' classe speciale] (http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal

risposta

15

Basta rimuovere where T : System.Object.

affermando:

where T : System.Object 

che stai dicendo che i tipi T utilizzabili nel metodo Parse devono ereditare da oggetto.
Tuttavia, poiché ogni oggetto in C# eredita da System.Object non è necessario tale vincolo (e probabilmente questo è uno dei motivi per cui il compilatore non lo consente).

Inoltre, dal momento che stai tornando null, si dovrebbe vincolo del tipo T di essere un tipo di riferimento, in modo da:

where T: class 

Ma in questo modo non è possibile restituire un valore booleano, intero o qualsiasi valore genere.

Tuttavia, il codice imita in sostanza la funzionalità del Convert.ChangeType, l'unica differenza è che si sta utilizzando farmaci generici per restituire il tipo corretto al posto di oggetto, ma è sostanzialmente uguale a questo:

T Parse<T>(string val) 
{ 
    return (T)Convert.ChangeType(val,typeof(T)); 
} 
+0

per qualcos'altro, ma ho trovato questa risposta che ha risolto il mio problema. –

Problemi correlati