2009-11-28 3 views
3

Je veux savoir pourquoi ci-dessous baissés échoue le temps @ run:pourquoi baissés échoue à l'exécution

Cas 1:

Object y = 10.23; 
Console.WriteLine(y.GetType()); //System.Double 
int z = (int)y;// fails @ runtime 
Console.ReadKey(); 

Cas n ° 2:

Double y = 10.23; 
Console.WriteLine(y.GetType());//System.Double 
int z = (int)y;//success 
Console.ReadKey(); 

Dans les deux cas, le type de y est System.Double, encore pourquoi downcst échoue dans le premier cas?

+0

(a répondu à commenter) –

+0

Marc est bien sûr correct. Pour une analyse plus approfondie de pourquoi ce type de distribution n'est pas légal, voir mon article sur le sujet: http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

Répondre

11

Dans le premier exemple; unboxing (ce que vous montrez) est différent à la descente ou à la conversion; il est peut-être regrettable que C# utilise la même syntaxe pour tous les 3.

Vous devez les types de valeur unbox (tels que int/double) correctement. Ou utilisez Convert.ToInt32(y) qui a la logique pour cette intégrée.

Dans le second exemple, il s'agit d'une conversion (pas une boîte de dialogue, et pas une baisse). Les conversions sont définies soit dans la spécification de langage (comme dans ce cas), soit via des opérateurs statiques personnalisés.

La différence est object. La boîte change tout.

+0

merci , J'ai compris. Dans le premier cas il y a un autre moyen de déballer plutôt que Convert.ToInt32 (y) – Wondering

+2

Oui - vous pouvez faire '(int) (double) y', qui unboxes (correctement) à' double', et * then * fait une * conversion * en 'int'. –

+0

oui, travaillé.ainsi la chaîne est la boxe -> unboxing et que -> conversion. Merci pour votre aide. – Wondering

Questions connexes