Depuis, le compilateur peut convertir implicitement le type int en double, il choisit la B. méthode Abc. Ceci est expliqué dans ce post par Jon Skeet (de la recherche pour "implicite"):
La cible de l'appel de méthode est une expression de type Enfant, de sorte que le
le compilateur cherche d'abord à l'Enfant de la classe. Il n'y a qu'une seule méthode
il y a, et c'est le cas (il y a une conversion implicite de type int pour
double) alors que c'est celui qui est ramassé. Le compilateur n'a pas
considérons la méthode Parent à tous.
La raison pour cela est de réduire le risque de fragile de la classe de base
problème...
Plus de Eric Lippert
Comme le standard dit, "méthodes dans une classe de base ne sont pas des candidats si une méthode dans une classe dérivée est applicable".
En d'autres termes, la résolution de surcharge de l'algorithme commence par la recherche
la classe d'une méthode applicable. Si il en trouve un, puis tous les autres
méthodes applicables dans le plus profond des classes de base sont retirés de la
ensemble candidat pour la résolution de surcharge. Depuis Le Delta.Frob(float) est
échéant, Charlie.Frob(int) est même jamais considéré comme un candidat.
Seulement si non applicable, les candidats sont trouvés dans la plupart des dérivés de type ne
nous partons à la recherche à sa classe de base.
Les choses deviennent un peu plus intéressantes, si nous prolongeons l'exemple de votre question avec cette classe supplémentaire qui descend d'Un:
class C : A {
public void Abc(byte b) {
Console.Write("C");
}
}
Si nous exécutons le code suivant
int i = 1;
b.Abc((int)1);
b.Abc(i);
c.Abc((int)1);
c.Abc(i);
les résultats sont BBCA
. C'est parce que dans le cas de la classe B, le compilateur sait qu'il peut implicitement exprimés tout en int en double. Dans le cas de la classe C, le compilateur sait qu'il peut lancer le littéral int 1 à un octet (car la valeur 1 correspond à un octet) donc C de la méthode Abc est utilisé. Le compilateur, cependant, ne peut pas implicitement jeter un vieux int à un octet, donc, c.Abc(i)
ne pouvez pas utiliser C de la méthode Abc. Il faut utiliser la classe parent dans ce cas.
Cette page sur l'Implicite Conversions Numériques, montre une table compacte dont les types numériques ont conversions implicites à d'autres types numériques.