2011-04-11 4 views
1

Ce déclenche une exception qui disent la source ne peut pas être casté en destination:C# int coulée de flotter lancer exception (en exécution)

int a = 1; 
object b = (object)a; 
float c = (float)b; // Exception here 

Pourquoi?

+3

double possible de [Pourquoi \ [(int) (objet) 10 m; \] ne lance pas l'exception "Cast spécifié n'est pas valide"?] (http://stackoverflow.com/questions/3953391/why-intobject10m-does-throw-specified-cast-is-not-valid-exception) –

Répondre

5

Vous ne pouvez lancer struct boxed le type exact, vous aurez donc besoin de jeter un int premier:

float c = (float)(int)b; 

Toutefois, étant donné qu'il ya une conversion implicite de flotter à partir int, vous pouvez simplement faire:

float c = (int)b; 
1

Pour autant que je sais que c'est parce que vous La boîte « a » comme un entier et après que vous Unbox comme un flotteur et cela ne marchera pas ...

pour obtenir ce droit, vous devriez faire flotter c = (flotteur) (int) b;

1

Vous ne pouvez pas décompacter (convertir en objet et en retour) une valeur d'un type de données vers un autre. Vous devrez d'abord le ramener à son type d'origine, puis le retirer. Vous pouvez également utiliser les méthodes Convert.To*, par ex.

Object a = 6; 
Double b = Convert.ToDouble(a); 

Suivi: http://www.ideone.com/hgeob

0

Le problème est que la même syntaxe est réutilisée pour 3 opérations (problème historique de C):

  1. Boxe/unboxing la valeur
  2. Conversion des nombres
  3. Coulée

int a = 1; // Ok 
object b = (object)a; // Ok. int is struct so we may box it into object 
float c = (float)a; // Ok. Conversion from integer to float 
float c = (float)b; // Error. object b is not boxed float 
+0

UL/Les OL sont drôles avec l'analyseur, vous devez ajouter quelque chose entre eux. Dans ce cas, j'ai utilisé une balise arbitraire HTML (pour invoquer le formatage, mais pas interférer avec le message lui-même). –