La meilleure explication que j'ai vue peut être vue ci-dessous, suivie d'un lien vers la source :
"... La vérité est un peu plus complexe que ça. .NET fournit trois méthodes pour aller de point A à point B, pour ainsi dire.
Premièrement, il y a la conversion implicite. C'est la conversion qui ne nécessite rien de plus qu'une affectation :
int i = 5;
double d = i;
Celles-ci sont également appelées "conversions d'élargissement" et .NET vous permet de les effectuer sans aucun opérateur de conversion car vous ne risquez jamais de perdre d'information : la plage possible de valeurs valides d'un double englobe la plage de valeurs valides pour un int et même un peu plus, donc vous ne risquez jamais de faire cette affectation et de découvrir avec horreur que le runtime a supprimé quelques chiffres de votre valeur int. Pour les types de référence, la règle derrière une conversion implicite est que la conversion ne peut jamais lancer de InvalidCastException : il est clair pour le compilateur que la conversion est toujours valide.
Vous pouvez créer de nouveaux opérateurs de conversion implicite pour vos propres types (ce qui signifie que vous pouvez faire des conversions implicites qui ne respectent aucune règle, si vous êtes stupide à ce sujet). La règle de base est qu'une conversion implicite ne peut jamais inclure la possibilité de perdre de l'information lors de la transition.
Remarquez que la représentation sous-jacente a bel et bien changé dans cette conversion: un double est représenté complètement différemment d'un int.
Le deuxième type de conversion est une conversion explicite. Une conversion explicite est requise lorsque qu'il y a une possibilité de perte d'information, ou une possibilité que la conversion puisse ne pas être valide et donc lancer une InvalidCastException :
double d = 1.5;
int i = (int)d;
Ici vous allez évidemment perdre de l'information : i sera 1 après la conversion, donc le 0.5 est perdu. Cela est également appelé une conversion "rétrécissante", et le compilateur exige que vous incluiez une conversion explicite (int) pour indiquer que oui, vous savez que de l'information peut être perdue, mais que cela ne vous dérange pas.
De même, avec les types de référence, le compilateur exige des conversions explicites dans les situations où la conversion peut ne pas être valide au moment de l'exécution, comme un signal que oui, vous savez qu'il y a un risque, mais que vous savez ce que vous faites.
Le troisième type de conversion est celui qui implique un changement aussi radical dans la représentation que les concepteurs n'ont pas même prévu une conversion explicite : ils vous obligent à appeler une méthode pour faire la conversion :
string s = "15";
int i = Convert.ToInt32(s);
Remarquez qu'il n'y a rien qui exige absolument un appel à une méthode ici. Les conversions implicites et explicites sont aussi des appels de méthode (c'est ainsi que vous créez les vôtres). Les concepteurs auraient tout à fait pu créer un opérateur de conversion explicite qui convertit une string en int. L'exigence d'appeler une méthode est un choix stylistique plutôt qu'une exigence fondamentale du langage.
Le raisonnement stylistique est le suivant : String-to-int est une conversion compliquée avec de nombreuses opportunités pour tout aller horriblement mal :
string s = "The quick brown fox";
int i = Convert.ToInt32(s);
En tant que tel, l'appel de méthode vous donne de la documentation à lire, et un indice large que c'est quelque chose de plus qu'une simple conversion rapide.
Lors de la conception de vos propres types (en particulier vos propres types de valeur), vous pouvez décider de créer des opérateurs de conversion et des fonctions de conversion. Les lignes qui séparent les territoires de la "conversion implicite", "conversion explicite" et "fonction de conversion" sont un peu floues, donc différentes personnes peuvent prendre différentes décisions sur ce qui devrait être quoi. Essayez simplement de garder à l'esprit la perte d'information, et le risque d'exceptions et de données invalides, et cela devrait vous aider à décider."
- Bruce Wood, 16 novembre 2005
http://bytes.com/forum/post1068532-4.html