Quand vous dites Y y = (Y)x;
cette distribution indique au compilateur "faites-moi confiance, quel que soit x
est, à l'exécution, il peut être utilisé pour un Y
, donc, il suffit de le faire, d'accord?"
Mais quand vous dites
List<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
le compilateur peut regarder les définitions de chacune de ces classes concrètes (Banana
et List<Banana>
) et de voir qu'il n'y a pas d' static explicit operator Banana(List<Banana> bananas)
défini (rappelez-vous, un cast explicite doit être défini dans le type coulée ou le type en train de coulé, c'est à partir de la spécification, la section 17.9.4). Il sait au moment de la compilation que ce que vous dites ne peut jamais être vrai. Donc, il hurle à vous d'arrêter de mentir.
Mais quand vous dites
IEnumerable<Banana> aBunchOfBananas = new List<Banana>();
Banana justOneBanana = (Banana)aBunchOfBananas;
bien, maintenant que le compilateur ne sait pas. Il pourrait très bien le cas que, quelle que soit aBunchOfBananas
arrive à être au moment de l'exécution, son type de béton X
pourrait avoir défini static explicit operator Banana(X bananas)
. Ainsi, le compilateur a confiance en vous, comme vous l'avez demandé.