Non c'è modo di lanciare una System.String
in una System.Int32
A differenza di molti altri linguaggi (ad es. PHP o JavaScript), C # è strongmente digitato . Questo significa numeri ( int
nel tuo caso) e le stringhe sono due cose molto diverse. Uno non può essere lanciato all'altro, perché il compilatore C # non ha idea di come effettuare una conversione implicita tra i due tipi. In un linguaggio blandamente tipizzato non ci sono tipi reali , il compilatore di solito rende un indovinato informato su quale tipo ha la tua variabile.
Quindi, casting è per quando hai un tipo che "potrebbe essere" un altro tipo. Ad esempio, potresti avere un intero in scatola come object
. In questo caso è perfettamente legale scrivere int number = (int)someObject;
ma è necessario sapere in anticipo che someObject
può essere convertito in un numero intero, altrimenti un InvalidCastException
verrà lanciato in fase di runtime.
Puoi anche "trasmettere" un tipo a (uno dei) tipi di base, questo comunemente indicato come down-cast. Ad esempio: var enumerable = (IEnumerable<string>)new List<string>();
. Questo tuttavia, di solito è fatto implicitamente nelle chiamate al metodo, non ci sono casi d'uso comuni in cui esplicitamente devono down-cast un tipo.
È importante notare che down-casting non "convertirà" un tipo. La mia variabile denominata enumerable
nell'esempio precedente è ancora un List<string>
. La differenza è che ora è in scatola come IEnumerable<string>
. Puoi unbox il tuo elenco tramite un nuovo cast: var list = (List<string>)enumerable;
o tramite as
-keyword se stai usando un reference- type (class).
C # supporta anche la trasmissione tra i diversi tipi di numeri. Ad esempio un System.Decimal
o un System.Double
può essere castato a System.Int32
. Ma i decimali riceveranno troncati . Ad esempio int truncatedPI = (int)Math.PI;
ti darà 3
. Ma per quanto ne so; questo è solo compilatore-magico.
Quello che devi controllare è qualcosa chiamato parsing .
L'analisi è il meccanismo in cui hai un valore, che non è nel tipo desiderato (comunemente una stringa) e parse al tipo che vuoi, usando un parser incorporato o scrivendo il tuo parser.
La maggior parte dei comuni tipi di valore (structs ed enum) in .NET hanno costruito -in statico Parse
-methods.
Per numeri interi: int.Parse("15")
, per date: DateTime.Parse("2015-08-02 00:00")
e così via. Questi sono parser integrati, inclusi nel framework .NET.
Console.ReadLine
restituisce una stringa che non può essere convertita implicitamente in un numero intero mediante il cast (boxing o unboxing). Per risolvere il tuo problema devi usare uno dei metodi di analisi menzionati sopra.
Nel tuo caso int number = int.Parse(Console.ReadLine());
sarebbe molto probabilmente sufficiente. Ma fai attenzione, se inserisci qualcosa come "HELLO"
nella tua applicazione-console, int.Parse
genererà un FormatException
poiché ciò che hai inserito non può essere interpretato dal parser.
Questo è dove TryParse
e TryParseExact
, entra. Di solito sono alternative più valide per la gestione dell'input dell'utente.
Come regola generale, prova ad evitare Convert.To[Type]
durante l'analisi delle stringhe. Generalmente queste sono solo implementazioni "pigre" del metodo Parse
. L'utilizzo dei metodi di analisi sopra menzionati include più opzioni, una migliore scalabilità e inoltre richiede al programmatore informazioni più precise su ciò che accade nel codice.