string variable = "5.00";
double varDouble = (double)variable;
La conversion ci-dessus n'est tout simplement pas autorisée par la langue. Voici une liste de conversions explicites pour les types numériques : http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx Comme vous pouvez le constater, tous les types numériques ne peuvent pas être convertis en un autre type numérique.
Quelques informations supplémentaires sur le casting ici
Et en quoi cela diffère-t-il de Convert.ToDouble() ?
Lorsque vous exprimez un type, la structure des données n'est pas modifiée. En revanche, dans le cas d'une conversion de valeurs numériques, vous pouvez perdre quelques bits ou obtenir quelques bits 0 supplémentaires. Mais vous travaillez toujours avec un nombre. Vous ne faites que changer la quantité de mémoire prise par ce nombre. C'est suffisamment sûr pour que le compilateur fasse tout ce qui est nécessaire.
Mais lorsque vous essayez de convertir une chaîne de caractères en un nombre, vous ne pouvez pas le faire car cela ne suffit pas à modifier la quantité de mémoire prise par la variable. Par exemple, 5.00 comme une chaîne de caractères est une séquence de "chiffres" : 53(5) 46(.) 48(0) 48(0) - c'est pour l'ASCII, mais une chaîne de caractères contiendra quelque chose de similaire. Si le compilateur ne prend que les N premiers octets (4 pour les doubles ? je ne suis pas sûr) d'une chaîne, ce morceau contiendra un nombre double complètement différent. Dans le même temps, Convert.ToDouble() exécute un algorithme spécial qui prend chaque symbole d'une chaîne, détermine le chiffre qu'il représente et crée un nombre double pour vous, si la chaîne représente un nombre. Des langages comme PHP vont, en gros, appeler Convert.ToDouble pour vous en arrière-plan. Mais C#, en tant que langage à typage statique, ne le fera pas pour vous. Cela vous permet d'être sûr que toute opération est sûre au niveau du type et que vous n'obtiendrez pas quelque chose d'inattendu en faisant quelque chose comme :
double d = (double)"zzzz"