2010-03-21 14 views
1

Fondamentalement, je veux faire cela. aa provoque une exception d'incantation incorrecte.
NOTE: o peut être n'importe quoi. Il peut ne pas être B, il peut être C, D, E, F etc. Mais ceci devrait fonctionner tant que o est une classe qui peut être cataloguée en A (B est une telle classe Elle utilise une surcharge d'opérateur implicite)Comment lancer A pour s'opposer à la classe A lorsque B peut taper dans A?

 var b = (B)"sz"; 
     var a = (A)b; 
     object o = b; 
     var aa = (A)o; 
+2

Ce code exemple serait plus lisible si vous avez remplacé le mot-clé 'de var' avec les types inférées réels. –

+0

Voté pour fermer, comme ceci est une deuxième tentative de demander: http://stackoverflow.com/questions/2486791/how-do-i-cast-unobject-to-a-string-when-object-is- not-a-string/2486815 # 2486815 sauf maintenant il y a encore moins d'informations contextuelles. –

+0

@Daniel Earwicker: J'ai l'impression que la partie des cordes perturbe les gens et ce que je fais ci-dessus est ce que je fais dans le code. –

Répondre

4

Avez-vous essayé d'effectuer les opérations suivantes?

[...] 
var ee = (A)(B)o; 

La raison pour laquelle cela fonctionnera et votre code n'est que ces moulages sont explicites statiquement compilé. En d'autres termes, quand vous dites (A)o le compilateur cherche une distribution explicite de objet à A et n'en trouve pas. Cependant, il détermine que A est une sous-classe d'objet, de sorte que la distribution peut être viable au moment de l'exécution - et qu'elle insère une tentative d'exécution vers le bas de l'instance dans un champ de type A. Ces conversions d'exécution n'ont rien à voir avec des conversions explicites et/ou implicites; ceux-ci suivent simplement les règles de hiérarchie de types intégrées.

Un autre exemple:

object o = 1.0; 
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK. 
+0

éditer pour rendre cela plus clair. –

+0

+1 pour expliquer pourquoi les surcharges d'opérateur ne fonctionneront pas. Je suis susceptible d'accepter cela. –

+0

Droite. C'est exactement la même chose que la résolution de surcharge. Si vous dites "ob = girafe" et que vous avez surchargé les méthodes M (objet) et M (Animal) alors M (ob) choisit la surcharge de l'objet au moment de la compilation, peu importe ce que ob est à l'exécution. Le compilateur choisit l'opérateur de conversion "object to A" sur l'opérateur de conversion "B to A" car c'est ce qui est connu au moment de la compilation. C'est ce que vous obtenez pour avoir un langage typé statiquement; si vous voulez qu'il soit dynamiquement typé, alors (1) utilisez une langue dynamiquement typée, ou (2) utilisez le mot-clé dynamique en C# 4. –