web-dev-qa-db-fra.com

Quelle est la différence entre Convert.ToInt32 et (int)?

Le code suivant génère une erreur de compilation telle que

Impossible de convertir le type 'chaîne' en 'int'

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

alors que le code ci-dessous compile et exécute avec succès:

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

J'aimerais savoir:

  1. Pourquoi le premier code génère-t-il une erreur de compilation?

  2. Quelle est la différence entre les 2 extraits de code?

47
balalakshmi

(int)foo est simplement un transtypage vers le type Int32 (int en C #). Ceci est intégré au CLR et requiert que foo soit une variable numérique (par exemple, float, long, etc.). En ce sens, cela ressemble beaucoup à un transtypage en C.

Convert.ToInt32 est conçu pour être une fonction de conversion générale. Cela fait beaucoup plus que des castings; à savoir, il peut convertir le type primitif any en un int (notamment en analysant un string). Vous pouvez voir la liste complète des surcharges pour cette méthode ici sur MSDN .

Et comme Stefan Steiger mentions dans un commentaire :

Notez également qu'au niveau numérique, (int) foo tronque foo (ifoo = Math.Floor(foo)), tandis que Convert.ToInt32(foo) utilise demi pour arrondir même (arrondit x.5 à l'entier EVEN le plus proche, signifiant ifoo = Math.Round(foo)). Le résultat n'est donc pas seulement du point de vue de la mise en œuvre, mais aussi numériquement pas identique.

60
Noldorin

(cette ligne se rapporte à une question qui a été fusionnée) Vous ne devez jamais utiliser (int)someString - cela ne fonctionnera jamais (et le compilateur ne vous le laissera pas).

Cependant, int int.Parse(string) et bool int.TryParse(string, out int) (et leurs diverses surcharges) sont acceptables.

Personnellement, je principalement n’utilise que Convert quand j’ai affaire à une réflexion, donc pour moi le choix est Parse et TryParse. La première est quand je prévois que la valeur est un entier valide et que vous voulez une exception sinon. La seconde est quand je veux vérifier si c'est un entier valide - je peux alors décider quoi faire quand c'est/n'est pas.

18
Marc Gravell

Pour citer cet article article d'Eric Lippert :

Cast signifie deux choses contradictoires: "vérifier si cet objet est vraiment de ce type, mais si ce n'est pas le cas" et "cet objet n'est pas du type donné; trouvez-moi une valeur équivalente qui appartient au type donné".

Donc, ce que vous essayiez de faire dans 1.) est d’affirmer que oui, String est un Int. Mais cette assertion échoue puisque String n'est pas un entier.

La raison 2.) réussit est due au fait que Convert.ToInt32 () analyse la chaîne et renvoie un int. Il peut toujours échouer, par exemple:

Convert.ToInt32("Hello");

Cela entraînerait une exception Argument.

En résumé, la conversion d'une chaîne en un entier est une préoccupation de la structure, pas quelque chose d'implicite dans le système de type .Net.

5
ecoffey

Vous parlez d'une opération de diffusion C # avec des utilitaires de conversion .NET

  • C # Le niveau de langage CASTING utilise des parenthèses - par exemple. (int) - et la prise en charge de la conversion est limitée, car elle repose sur la compatibilité implicite entre les types ou sur des instructions explicitement définies par le développeur via opérateurs de conversion .
  • De nombreuses méthodes de conversion existent dans le .NET Framework, par exemple. System.Convert , pour autoriser conversion entre des types de données identiques ou disparates.

La syntaxe (Casting) fonctionne sur les types de données numériques, ainsi que sur les types de données "compatibles". Par types de données compatibles, il existe une relation établie par héritage (classes de base/dérivées) ou par implémentation (interfaces).

La conversion peut également fonctionner entre des types de données disparates pour lesquels opérateurs de conversion sont définis.

La classe System.Convert, en revanche, est l’un des nombreux mécanismes disponibles pour convertir les choses au sens général; il contient une logique permettant la conversion entre des types de données disparates et connus pouvant être modifiés logiquement d'un formulaire à un autre.

La conversion couvre même une partie du terrain de la diffusion en permettant la conversion entre des types de données similaires.


Rappelez-vous que le langage C # a sa propre façon de faire certaines choses.
Et le .NET Framework sous-jacent a sa propre façon de faire les choses, indépendamment de tout langage de programmation.
(Parfois, leurs intentions se chevauchent.)

Considérez le casting comme une fonctionnalité de niveau langage C # de nature plus limitée, et la conversion via la classe System.Convert comme l'un des nombreux mécanismes disponibles dans le framework .NET pour convertir des valeurs entre différents types.

4
John K

Une chaîne ne peut pas être convertie en un entier via une diffusion explicite Il doit être converti avec int.Parse.

Convert.ToInt32 encapsule fondamentalement cette méthode:

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

1) C # est un langage sûr et ne vous permet pas d’attribuer une chaîne à un nombre

2) la deuxième casse analyse la chaîne dans la nouvelle variable . Dans votre cas, si la session est une session ASP.NET, vous n’avez pas à y stocker de chaîne et à la reconvertir

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

Il n'y a pas de conversion par défaut de chaîne en int dans .NET. Vous pouvez utiliser int.Parse () ou int.TryParse () pour le faire. Ou, comme vous l'avez fait, vous pouvez utiliser Convert.ToInt32 ().

Cependant, dans votre exemple, pourquoi faire un ToString () et le reconvertir ensuite en int? Vous pouvez simplement stocker l'int dans Session et le récupérer comme suit:

int i = Session["name1"];
1
Jerry Bullard

Juste un petit extra: dans différentes circonstances (par exemple, si vous convertissez un double, & c en un Int32), vous voudrez peut-être aussi vous soucier de l'arrondi lorsque vous choisissez entre ces deux. Convert.Int32 utilisera les arrondis bancaires ( MSDN ); (int) sera simplement tronqué en un entier.

1
Tim Barrass

C'est vieux, mais une autre différence est que (int) ne complète pas les nombres si vous avez un double ej: 5.7 la sortie utilisant (int) sera 5 et si vous utilisez Convert.ToInt (), le nombre arrondir à 6.

0
Angel Ruiz

Convert.ToInt32

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

mais (int) est une transtypage, donc (int) "2" ne fonctionnera pas car vous ne pouvez pas transtyper string en int. mais vous pouvez l’analyser comme Convert.ToInt32 do

0
Ilya Khaprov

La différence est que le premier extrait est un casting et le second est un converti. Bien que, je pense que l’erreur du compilateur crée plus de confusion ici à cause de la formulation. Peut-être serait-il préférable de dire "Impossible de convertir le type" chaîne "en" int ".

0
Joseph