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

Il seguente codice genera un errore in fase di compilazione come

Imansible convertire il tipo ‘stringa’ in ‘int’

string name = Session["name1"].ToString(); int i = (int)name; 

mentre il seguente codice compila ed esegue correttamente:

 string name = Session["name1"].ToString(); int i = Convert.ToInt32(name); 

Mi piacerebbe sapere:

  1. Perché il primo codice genera un errore in fase di compilazione?

  2. Qual è la differenza tra i 2 snippet di codice?

(int)foo è semplicemente un cast per il tipo Int32 ( int in C #). Questo è incorporato nel CLR e richiede che foo sia una variabile numerica (es. float , long , ecc.) In questo senso, è molto simile a un cast in C.

Convert.ToInt32 è progettato per essere una funzione di conversione generale. Fa molto di più del casting; vale a dire, può convertire da qualsiasi tipo primitivo a un int (in particolare, l’analisi di una string ). È ansible visualizzare l’elenco completo dei sovraccarichi per questo metodo qui su MSDN .

(questa riga si riferisce a una domanda che è stata unita) Non dovresti mai usare (int)someString – che non funzionerà mai (e il compilatore non ti lascerà).

Tuttavia, int int.Parse(string) e bool int.TryParse(string, out int) (e i loro vari overload) sono fair game.

Personalmente, principalmente utilizzo Convert solo quando ho a che fare con la riflessione, quindi per me la scelta è Parse e TryParse . Il primo è quando mi aspetto che il valore sia un numero intero valido e voglio che lanci un’eccezione altrimenti. Il secondo è quando voglio verificare se è un numero intero valido – posso quindi decidere cosa fare quando è / non lo è.

Per citare questo articolo di Eric Lippert :

Cast significa due cose contraddittorie: “controlla se questo object è veramente di questo tipo, lancia se non lo è” e “questo object non è del tipo dato, trovami un valore equivalente che appartiene al tipo dato”.

Quindi quello che stavi cercando di fare in 1.) è asserire che yes a String is an Int. Ma questa asserzione fallisce poiché String non è un int.

Il motivo 2.) ha successo è perché Convert.ToInt32 () analizza la stringa e restituisce un int. Può ancora fallire, ad esempio:

 Convert.ToInt32("Hello"); 

Risulterà in un’eccezione Argument.

Per riassumere, la conversione da una stringa ad una Int è un problema di framework, non qualcosa di implicito nel sistema di tipo .Net.

Stai parlando di un’operazione di fusione C # rispetto alle utilità di conversione .NET

  • Il casting a livello di linguaggio C # utilizza parentesi – ad esempio (int) – e il supporto di conversione per esso è limitato, basandosi sulla compatibilità implicita tra i tipi o istruzioni esplicitamente definite dallo sviluppatore tramite operatori di conversione .
  • Esistono molti metodi di conversione in .NET Framework, ad esempio System.Convert , per consentire la conversione tra tipi di dati uguali o diversi.

La syntax (Casting) funziona su tipi di dati numerici e anche su tipi di dati “compatibili”. Compatibile significa tipi di dati per i quali esiste una relazione stabilita attraverso l’ereditarietà (cioè classi base / derivate) o attraverso l’implementazione (es. Interfacce).

La trasmissione può anche funzionare tra diversi tipi di dati con operatori di conversione definiti.

La class System.Convert d’ altra parte è uno dei molti meccanismi disponibili per convertire le cose in senso generale; contiene la logica per convertire tra tipi di dati disparati e noti che possono essere modificati logicamente da una forma all’altra.

La conversione copre anche alcune delle basi del casting, consentendo la conversione tra tipi di dati simili.


Ricorda che il linguaggio C # ha il suo modo di fare alcune cose.
E il sottostante .NET Framework ha il suo modo di fare le cose, a parte qualsiasi linguaggio di programmazione.
(A volte si sovrappongono alle loro intenzioni).

Pensa di lanciare una funzionalità a livello di linguaggio C # di natura più limitata e la conversione tramite la class System.Convert come uno dei molti meccanismi disponibili nel framework .NET per convertire valori tra diversi tipi.

Una stringa non può essere trasmessa a un int attraverso la trasmissione esplicita. Deve essere convertito usando int.Parse .

Convert.ToInt32 fondamentalmente avvolge questo metodo:

 public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); } 

Non c’è un cast predefinito da string a int in .NET. È ansible utilizzare int.Parse () o int.TryParse () per farlo. Oppure, come hai fatto, puoi usare Convert.ToInt32 ().

Tuttavia, nel tuo esempio, perché fai un ToString () e poi lo converti nuovamente in un intero? Potresti semplicemente memorizzare l’int in Session e recuperarlo come segue:

 int i = Session["name1"]; 

Solo un breve extra: in diverse circostanze (ad es. Se stai convertendo un double, & c in un Int32) potresti anche volerti preoccupare dell’arrotondamento quando scegli tra questi due. Convert.Int32 utilizzerà l’arrotondamento del banco ( MSDN ); (int) truncerà a un numero intero.

1) C # è un tipo di lingua sicura e non consente di assegnare una stringa al numero

2) il secondo caso analizza la stringa in una nuova variabile. Nel tuo caso se la sessione è sessione ASP.NET di quanto non sia necessario memorizzare la stringa lì e riconvertirla durante il recupero

 int iVal = 5; Session[Name1] = 5; int iVal1 = (int)Session[Name1]; 

Convert.ToInt32

     return int.Parse (valore, CultureInfo.CurrentCulture);

ma (int) è di tipo cast, quindi (int) “2” non funzionerà poiché non è ansible eseguire il cast di stringa su int. ma puoi analizzarlo come Convert.ToInt32 do

La differenza è che il primo snippet è un cast e il secondo è un convertito. Anche se, penso che forse l’errore del compilatore sta fornendo più confusione qui a causa della dicitura. Forse sarebbe meglio se dicesse “Non posso lanciare il tipo ‘stringa’ a ‘int’.

Questo è vecchio, ma un’altra differenza è che (int) non completa i numeri nel caso in cui tu abbia un doppio ej: 5.7 l’uscita usando (int) sarà 5 e se usi Convert.ToInt () il numero sarà arrotondare per 6.