2010-01-29 3 views
1

Si je crée la classe A et que la classe B hérite de la classe A, pourquoi C# m'oblige-t-il à basculer explicitement entre eux?Coulée explicite de types dérivés C#

Par exemple:

public class Mammal 
{ 
} 

public class Dog : Mammal 
{ 
} 

...

Mammal foo = new Dog(); // Invalid, wants an explicit cast 
Mammal bar = (Mammal)new Dog(); // This one works 

Je suis juste curieux de ce que le raisonnement est derrière cette restriction.

+4

La distribution explicite ne devrait pas être nécessaire, et quand je teste votre code la première version fonctionne très bien. Pourriez-vous poster un échantillon plus complet? – itowlson

+2

Je me demande qui votera cette question quand elle implique que la diffusion ne fonctionne pas automatiquement. – Blindy

+1

Downvoted parce que ce code fonctionne réellement –

Répondre

6

Vous ne savez pas exactement ce que vous voulez dire? Les deux déclarations que vous avez écrites compilent et fonctionnent bien.

Vouliez-vous écrire ceci comme votre question ...?

Dog foo = new Mammal(); // Invalid, wants an explicit cast 
Dog bar = (Dog)new Mammal(); // This one works 

Si tel était ce que vous entendez (qui correspondent aux commentaires), le premier ne compilera pas parce qu'un Mammal n'est pas un Dog et le compilateur qu'il sait, il ne vous laissera pas l'attribuer (un Dog est un Mammal car il en dérive, mais l'inverse n'est pas vrai). Dans le second, vous écrasez le meilleur jugement du compilateur, et vous lui dites que vous savez mieux qu'un Mammal est vraiment un Dog, mais comme ce n'est pas le cas, cette instruction échouera à l'exécution avec un InvalidCastException.

+0

Et ce serait un problème de variance. http://blogs.msdn.com/ericlippert/archive/tags/Covariance%20and%20Contravariance/default.aspx –

+0

Ce n'est pas un problème de variance. – itowlson

+0

J'étais sûr que j'avais déjà observé cela, mais oui il semble que mon code de test avait les classes en arrière –

2

Ils fonctionnent tous les deux.

Questions connexes