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: p> 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? P> 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. P> merci,
TIM P> P>
3 Réponses :
Il n'y a pas de coulé disponible à partir d'une boîte int32 à un INT64.
Faire fonctionner une extinction intermédiaire sur mais non (hypothétiquement) ceci: p> int code> devrait fonctionner, car le compilateur est prêt à générer ceci:
// 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;
Vous voulez dire le compilateur ou l'exécution? P>
Le temps d'exécution est assez intelligent, de sorte qu'il lance le 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. p>
blockQuote>
Donc, depuis son encadré en tant qu'objet, le compilateur ne se plaingera pas. p>
Voir plus d'informations sur la boxe et la boîteboxing ici: P>
http://msdn.microsoft.com/ en-us / bibliothèque / yz2be5wk% 28vs.80% 29.aspx p> invalidalcastexception code>. Le compilateur ne peut toutefois pas savoir avec certitude quel type votre objet est, puisque vous avez encadré votre int. p>
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