Bonjour,
je viens de voir dans le code d'un de mes collaborateurs la chose suivante :
une variable de type TObjectList<TMachin> est passé en argument à une fonction qui attends un TObjectList. Comme la version générique de "TOjectList" n'hérite pas de la version classique (les classes génériques ont une implémentation "parallèle" à leur homologue non générique) il a simplement hardcasté en "TObjectList".
Et là je me dis "horreur !" ça ne marchera pas et provoquera des erreurs de violations d'accès et autres... et bien non, tout fonctionne bien, comme si le compilateur, lors d'un hardcast, essayait de faire une conversion "propre" d'un type en un autre. Personnellement je ne comprends pas, j'ai du louper quelque chose mais pour moi un hardcast ne fait que forcer le type pour permettre la compilation mais aucune opération de conversion. D'ailleurs la seule différence avec le "soft" cast est que dans ce cas le compilo vérifie d'abord que le type est compatible (hérite ou pour une interface implémente)...
Alors visiblement je me plante, quelqu'un pourrait-il m'expliquer comment cela fonctionne ?
Au debug j'ai pu voir que la fonction utilise les méthodes "Count" et "Get" de TOjbectList (en réalité de TList duquel il hérite), et qu'elles sont appelées tout à fait normalement dans la classe TList. Pour info la méthode "Get" n'existe même pas dans la version générique "TList<T>", elle a été renommée "GetItem"... alors y-a-t-il de la magie dans le compilo Dephi ou bien autre chose que j'ai zappé ???
Partager