Conversione di interi con Console.ReadLine () [closed]

-1

Per leggere un intero dall'input dell'utente, puoi usare:

int number = Convert.ToInt32(Console.ReadLine());

Ma perché il seguente lavoro non funzionerà?

int number = (int) Console.ReadLine();

Qual è la differenza tra Convert.ToInt32 e casting con (int) ?

    
posta Dan 02.08.2015 - 09:46
fonte

3 risposte

5

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.

    
risposta data 02.08.2015 - 14:07
fonte
1

Questo perché non esiste alcuna conversione esplicita o implicita tra questi due tipi in .NET framework. In altre parole, l'operatore di conversione esplicita non è sovraccarico nella classe string. Ulteriori informazioni sulla conversione di stringhe in numeri in C # si trovano in questo articolo . Leggi anche la fusione .

    
risposta data 02.08.2015 - 10:05
fonte
0

Questo potrebbe aiutare a capire perché questo non funziona.

"Ciao" + "lì"="Ciao", giusto?

1 + 3 = 4

Che cosa significa "Ciao" + 2 =?

Non ha senso.

Poiché Console.ReadLine restituisce una stringa, la lingua non ha modo di sapere se inserire o meno un numero. Quindi è necessario che tu dichiari esplicitamente che stai trasformando l'input in un numero, e questo è ciò che int.Parse fa. Converti chiama questo metodo, ma come detto sopra non è preciso come chiamare Parse.

    
risposta data 06.08.2015 - 23:28
fonte

Leggi altre domande sui tag