Vous avez plusieurs options:
(int)
- Opérateur de casting. Fonctionne si l'objet est déjà un entier à un certain niveau de la hiérarchie d'héritage ou si une conversion implicite est définie.
int.Parse()/int.TryParse()
- Pour la conversion à partir d'une chaîne de format inconnu.
int.ParseExact()/int.TryParseExact()
- Pour la conversion d'une chaîne dans un format spécifique
Convert.ToInt32()
- Pour convertir un objet de type inconnu. Il utilisera une conversion explicite et implicite ou une implémentation IConvertible le cas échéant.
as int?
- Noter la "?". L' as
opérateur est uniquement pour les types de référence, et j'ai donc utilisé "?" pour signifier a Nullable<int>
. L' as
opérateur " " fonctionne comme Convert.To____()
, mais pensez TryParse()
plutôt que Parse()
: il renvoie null
plutôt que de lancer une exception si la conversion échoue.
Parmi ceux-ci, je préférerais (int)
que l'objet soit vraiment juste un entier encadré. Sinon, utilisez Convert.ToInt32()
dans ce cas.
Notez que c'est une réponse très générale : je veux attirer l'attention sur la réponse de Darren Clark parce que je pense qu'elle fait du bon travail en abordant les détails ici, mais est arrivée tard et n'a pas encore été votée. Il obtient mon vote pour "réponse acceptée", de toute façon, pour avoir également recommandé (int), pour avoir signalé que si cela échouait, cela (int)(short)
pourrait fonctionner à la place, et pour vous recommander de vérifier votre débogueur pour connaître le type d'exécution réel.
Le casting
(int) myobject
devrait juste fonctionner.Si cela vous donne une exception de conversion non valide, c'est probablement parce que le type de variante n'est pas VT_I4. Mon pari est qu'une variante avec VT_I4 est convertie en un int boxed, VT_I2 en boxed short, etc.
Lorsque vous effectuez un cast sur un type de valeur encadré, il est uniquement valide de le convertir en type encadré. Par exemple, si la variante retournée est en fait un VT_I2, cela
(int) (short) myObject
devrait fonctionner.Le moyen le plus simple de le savoir est d'inspecter l'objet retourné et de regarder son type dans le débogueur. Assurez-vous également que dans l'assembly d'interopérabilité, vous avez la valeur de retour marquée avec
MarshalAs(UnmanagedType.Struct)
la source
Convert.ToInt32 (monobjet);
cela gérera le cas où myobject est nul et retournera 0, au lieu de lever une exception.
la source
ToInt32
.Utilisez
Int32.TryParse
comme suit.la source
J'énumère la différence dans chacun des modes de casting. Quel type particulier de poignées de moulage et ce n'est pas le cas?
la source
Peut-être Convert.ToInt32 .
Attention aux exceptions, dans les deux cas.
la source
la source
Convert.ChangeType
. Je dirais que ce n'est peut-être pas la réponse parfaite pour OP, mais c'est vraiment utile pour certains!Il y a aussi TryParse .
Depuis MSDN:
la source
Étrange, mais la réponse acceptée semble erronée à propos de la distribution et de la conversion en ce sens que d'après mes tests et la lecture de la documentation, elle ne devrait pas prendre en compte les opérateurs implicites ou explicites.
Donc, si j'ai une variable de type object et que la classe "boxed" a des opérateurs implicites définis, ils ne fonctionneront pas.
Au lieu de cela, un autre moyen simple, mais en réalité, le coût des performances consiste à lancer avant en dynamique.
(int) (dynamique) monObjet.
Vous pouvez l'essayer dans la fenêtre interactive de VS.
la source
dynamic
c'est loin d'être gratuitla source