Domanda

Il codice seguente genera un errore di compilazione come

Impossibile convertire il tipo 'stringa' in 'int'

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

considerando che il codice seguente viene compilato ed eseguito correttamente:

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

Vorrei sapere:

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

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

È stato utile?

Soluzione

(int) foo è semplicemente un cast del tipo Int32 ( int in C #). Questo è integrato nel CLR e richiede che foo sia una variabile numerica (ad 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 int (in particolare, analizzando una stringa ). Puoi vedere l'elenco completo dei sovraccarichi per questo metodo qui su MSDN .

E come Stefan Steiger menziona in un commento :

  

Inoltre, tieni presente che a livello numerico, (int) foo tronca foo ( ifoo = Math.Floor (foo) ), mentre Convert.ToInt32 (foo) utilizza metà per arrotondare uniformemente (arrotonda x.5 all'intero EVEN più vicino, che significa ifoo = Math.Round (foo) ). Il risultato non è quindi solo dal punto di vista dell'implementazione, ma anche numericamente non lo stesso.

Altri suggerimenti

(questa riga si riferisce a una domanda che è stata unita) Non dovresti mai usare (int) someString - che non funzionerà mai (e il compilatore non te lo permetterà).

Tuttavia, int int.Parse (stringa) e bool int.TryParse (stringa, out int) (e i loro vari sovraccarichi) sono un gioco equo.

Personalmente, principalmente uso 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 vorrei che generasse un'eccezione in caso contrario. Il secondo è quando voglio controllare se è un numero intero valido - posso quindi decidere cosa fare quando lo è / non lo è.

Per citare da questo articolo di Eric Lippert :

  

Cast significa due cose contraddittorie: " controlla per vedere se questo oggetto è davvero di questo tipo, lancia se non lo è " e " questo oggetto non è del tipo specificato; trovami un valore equivalente che appartiene al tipo specificato " ;.

Quindi quello che stavi cercando di fare in 1.) è affermare che sì una String è un Int. Ma questa affermazione fallisce poiché String non è un int.

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

Convert.ToInt32("Hello");

Si tradurrebbe in un'eccezione Argument.

Per riassumere, la conversione da una stringa a una Int è una preoccupazione del framework, non qualcosa di implicito nel sistema di tipo .Net.

Non è possibile eseguire il cast di una stringa in un int tramite cast esplicito. Deve essere convertito utilizzando int.Parse .

Convert.ToInt32 sostanzialmente avvolge questo metodo:

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

Stai parlando di un'operazione di casting C # rispetto alle utility di conversione .NET

  • C # Livello linguistico casting utilizza la parentesi, ad es (int) - e il supporto per la conversione è limitato, basandosi sulla compatibilità implicita tra i tipi o su istruzioni esplicitamente definite dallo sviluppatore tramite operatori di conversione .
  • Esistono molti metodi di conversione in .NET Framework, ad es. System.Convert , per consentire la conversione tra tipi di dati uguali o disparati.
La sintassi

?? (Casting) funziona su tipi di dati numerici e anche su " compatibile " tipi di dati. Compatibile indica i tipi di dati per i quali esiste una relazione stabilita tramite ereditarietà (ovvero classi di base / derivate) o mediante implementazione (ovvero interfacce).

Il cast può anche funzionare tra tipi di dati disparati che hanno operatori di conversione definiti.

La classe System.Convert è invece uno dei molti meccanismi disponibili per convertire le cose in senso generale; contiene una logica per la conversione tra tipi di dati disparati, noti, che possono essere logicamente modificati da un modulo all'altro.

La conversione copre anche alcuni aspetti della trasmissione 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, oltre a qualsiasi linguaggio di programmazione.
(A volte si sovrappongono nelle loro intenzioni.)

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

Non esiste un cast predefinito da stringa a int in .NET. Puoi usare int.Parse () o int.TryParse () per fare questo. Oppure, come hai fatto, puoi usare Convert.ToInt32 ().

Tuttavia, nel tuo esempio, perché fare un ToString () e poi convertirlo nuovamente in un int? Puoi semplicemente memorizzare l'int in Session e recuperarlo come segue:

int i = Session["name1"];

Solo un breve extra: in diverse circostanze (ad esempio se stai convertendo un doppio, & amp; c in un Int32) potresti anche preoccuparti di arrotondare quando scegli tra questi due. Convert.Int32 utilizzerà l'arrotondamento del banchiere ( MSDN ); (int) verrà troncato in un intero.

1) C # è un linguaggio sicuro e non ti consente di assegnare una stringa al numero

2) il secondo caso analizza la stringa in una nuova variabile.  Nel tuo caso, se la sessione è una sessione ASP.NET, non è necessario archiviare la stringa lì e riconvertirla al momento del recupero

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

Convert.ToInt32

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

ma (int) è di tipo cast, quindi (int) " 2 " non funzionerà poiché non è possibile eseguire il cast della stringa in int. ma puoi analizzarlo come Convert.ToInt32 fare

La differenza è che il primo frammento è un cast e il secondo è un convertito. Anche se, penso che forse l'errore del compilatore stia fornendo più confusione qui a causa della formulazione. Forse sarebbe meglio se dicesse " Impossibile eseguire il cast del tipo 'string' in '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 il numero sarà arrotondato a 6.

Questo è già stato discusso ma voglio condividere un dotnetfiddle.

Se hai a che fare con operazioni aritmetiche e usi float, decimal, double e così via, dovresti usare Convert.ToInt32 ().

using System;

public class Program
{
  public static void Main()
  {
    double cost = 49.501;
    Console.WriteLine(Convert.ToInt32(cost));
    Console.WriteLine((int)cost);
  }
}

Output

50
49

https://dotnetfiddle.net/m3ddDQ

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top