4 votes

Unboxing object containing a value which is known to be assignable to an integer variable (déballage d'un objet contenant une valeur dont on sait qu'elle peut être assignée à une variable entière)

Si j'ai un object et que je sais qu'il s'agit en fait d'un entier encadré, je peux simplement le recalculer en int comme ceci :

object o = GetSomethingByName("foo"); 
int i = (int)o;

Cependant, je ne sais pas si la valeur est un entier. Je sais seulement qu'elle peut être assignée à un entier. Par exemple, il pourrait s'agir d'un byte et le code ci-dessus renverrait InvalidCastException dans ce cas. Au lieu de cela, je devrais faire ceci :

object o = GetSomethingByName("foo"); 
int i = (int)(byte)o;

La valeur peut également être un short ou quelque chose d'autre qui peut être assigné à un int . Comment puis-je généraliser mon code pour traiter tous ces cas (sans traiter chaque possibilité séparément) ?

5voto

Wim Coenen Points 41940

Le simple fait d'écrire cette question m'a rappelé qu'il existe une Convert classe. Cela semble fonctionner :

int i = Convert.ToInt32(o);

éditer Il n'y a pas de différence entre les deux : mais malheureusement, il fera aussi des conversions de type que je ne veux pas, comme l'analyse des chaînes de caractères.

2voto

Peter Lillevold Points 20689

Il est intéressant de voir comment Convert.ToInt32 effectue la conversion :

    public static int ToInt32(object value) 
    {
        return value == null? 0: ((IConvertible)value).ToInt32(null); 
    } 

L'astuce consiste à transformer l'objet en IConvertible .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X