31Fermer33
SallyLe 26/01/2006 à 20:02
./26 > ben je n'ai pas vraiment parlé que des opérations, non ; conceptuellement les types sont bien différents, on n'a pas 0 = 0. ; un flottant c'est une approximation, tu peux facilement prendre a et b non nuls tels que a +. b –. a = 0. , or le résultat n'est pas le *nombre* 0. Bon ceci dit je comprends ce que tu veux dire : on a une injection canonique de int vers float, puisque tout entier a une unique représentation sous forme de flottant, donc on peut faire comme si cette injection était une inclusion, ok.
Mais ça c'est d'un point de vue utilisateur ; après tu as aussi une raison technique : les représentations internes de 0 et de 0. sont complètement différentes, or en principe si t1 est un sous-type de t2 ça signifie qu'une instance de t1 peut être utilisée *telle quelle* là où une instance de t2 est attendue. D'ailleurs contrairement à ce que j'ai écrit ":>" n'est pas vraiment un opérateur, c'est juste une annotation (comme le ":" tout court) : ça donne des informations au vérificateur de types sans lesquelles il n'arriverait pas à typer correctement, mais ça ne touche pas à la valeur et ça n'a pas (enfin ça j'en suis moins sûr) d'incidence sur la compilation (à moins que je me plante complètement mais ça m'étonnerait, enfin ce que je raconte me semble vraisemblable en tous cas grin. Enfin il y a peut-être des optimisations qui utilisent le typage j'en sais rien, mais l'idée c'est que c'est comme si ça se passait comme je dis quoi cheeky). En fait tout ce que tu fais quand tu passes dans un super-type c'est que tu oublies un certain nombre d'informations sur ta valeur. Mais là en l'occurrence il ne suffit pas d'oublier que 0 est un entier pour qu'il se transforme spontanément en flottant, il faut réellement le convertir, donc ça marche pas.

Pour les caractères et les chaînes, je ne vois pas d'obstacle conceptuel aussi évident que pour les nombres, mais a priori on a le même problème qui est qu'une chaîne de un caractère est représentée différemment en interne de juste un caractère (je suppose qu'on pourrait choisir des représentations pour que ça marche mais je ne pense pas que ça ait beaucoup d'intérêt pratique hehe)

edit : cross