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.