7
votes

Type d'objet de casting en C #

J'ai couru dans un problème aujourd'hui et je n'étais pas totalement sûr pourquoi cela ne fonctionnerait pas.

L'échantillon de code suivant s'écrasera: xxx

Ce sera entraîner une exception invalide. Pourquoi cela ne fonctionne-t-il pas? Est suffisamment intelligent pour savoir que l'objet est en réalité de type int?

J'ai déjà trouvé une solution de contournement, mais je suis curieux de savoir pourquoi l'échantillon de code ci-dessus n'a pas fonctionné dans la première place.

merci, TIM


1 commentaires

Je note qu'il s'agit d'un duplicata de nombreuses questions précédentes, y compris le plus récemment Stackoverflow.com/questions/3911293


3 Réponses :


9
votes

Il n'y a pas de coulé disponible à partir d'une boîte int32 à un INT64. Faire fonctionner une extinction intermédiaire sur int code> devrait fonctionner, car le compilateur est prêt à générer ceci: xxx pré>

mais non (hypothétiquement) ceci: p>

// Find out what type obj *actually* is at run-time and perform 
// the-known-only-at-run-time steps necessary to produce  
// a long from it, involving *type-specific* IL instructions  
long i64 = (long)obj; 


0 commentaires

1
votes

Vous voulez dire le compilateur ou l'exécution?

Le temps d'exécution est assez intelligent, de sorte qu'il lance le invalidalcastexception . Le compilateur ne peut toutefois pas savoir avec certitude quel type votre objet est, puisque vous avez encadré votre int.

Types de valeur d'activation de la boxe et de la boîte de commande être traité comme des objets. Boxe Type de valeur le package à l'intérieur d'un instance de la référence d'objet taper.

Donc, depuis son encadré en tant qu'objet, le compilateur ne se plaingera pas.

Voir plus d'informations sur la boxe et la boîteboxing ici:

http://msdn.microsoft.com/ en-us / bibliothèque / yz2be5wk% 28vs.80% 29.aspx


0 commentaires