2010-09-22 3 views

Répondre

10

Tout d'abord, c'est un double de

What is the difference between casting and conversion?

qui a été inspiré par

What is the (type) in (type)objectname.var

je lirais les d'abord, puis revenir à ce bref résumé.

Je vous renvoie au premier paragraphe du chapitre 6 du cahier des charges, qui stipule:

Une conversion permet une expression être considérée comme étant d'un type particulier . Une conversion peut entraîner une expression d'un type donné comme ayant un type différent, ou elle peut provoquer une expression sans type pour obtenir un type. Les conversions peuvent être implicite ou explicite, et ce détermine si un cast explicite est requis. Par exemple, la conversion de type int à type long est implicite, de sorte que les expressions de type int peuvent implicitement être traitées en tant que type long. La conversion opposée, de type long à type int, est explicite et donc une conversion explicite est requise.

Qu'apprenons-nous de cela?

  • A conversion est une opération sémantique sur deux opérandes: expression et un type .

  • L'opération exacte déterminée par l'analyse sémantique détermine comment la valeur réelle est convertie au moment de l'exécution.

  • A coulée est un élément syntaxique du langage C# de la forme (type)expression qui induit explicitement une conversion de l'expression du type.

Ce ne sont que quelques-uns des implicites des conversions que vous pouvez faire en C#:

short aa = 123;  // numeric constant conversion from int to short 
int bb = aa;   // numeric conversion from short to int 
int? cc = null;  // nullable conversion from null literal to nullable int. 
object dd = "hello"; // implicit reference conversion from string to object 
IEnumerable<Giraffe> ee = new Giraffe[] { new Giraffe() } ; 
        // implicit reference conversion from array to sequence 
IEnumerable<Animal> ff = ee; 
        // implicit reference conversion involving array covariance 
ff = null;   // implicit reference conversion from null literal to sequence 
bb = 456;   // implicit identity conversion from int to int 
dd = bb;    // implicit boxing conversion from int to object 
Func<int, int> gg = x=>x+x; 
        // anonymous function to delegate type conversion 

conversions généralement explicites, mais pas toujours, besoin d'un casting:

aa = (short)bb;  // explicit numeric conversion 
string hh = (string)dd; //explicit reference conversion 

Et ainsi de suite.

Il est légal d'utiliser un cast pour une conversion implicite mais généralement pas nécessaire.

Est-ce clair? Le point clé est que une conversion est une opération sémantique qui conduit à une action à l'exécution et une distribution est un élément syntaxique qui indique au compilateur d'analyser une conversion en utilisant les règles d'analyse de conversion explicites.

Si le sujet de la logique de conversion vous intéresse alors vous pourriez être intéressé par mes articles sur le sujet, qui sont ici:

http://blogs.msdn.com/b/ericlippert/archive/tags/conversions/

+1

"Les conversions explicites requièrent généralement, mais pas toujours, un cast": pourriez-vous donner un exemple où une distribution n'est pas nécessaire? Du haut de ma tête je ne peux pas penser à tout ... –

+1

@ Thomas: foreach (girafe g chez les animaux) induit une conversion explicite de l'animal à la girafe sans jeter. octet b = 1; b + = 2; induit une conversion explicite d'int en octet; ceci est analysé comme b = (octet) ((int) b + (int) 1)). Une conversion qui est une conversion explicite définie par l'utilisateur peut introduire une conversion explicite intégrée "de chaque côté" de l'opérande; dans ce cas, nous avons un cast dans le code source, mais il peut provoquer l'exécution de trois conversions explicites. –

+0

Il existe également des scénarios d'interopérabilité obscurs dans lesquels le compilateur insère une conversion explicite d'interface en classe en votre nom. –

2

Conversion = transformant en fait un objet en une instance d'une autre classe ex:

int i = 3; 
string str = i.ToString(); 

Transforme un entier en une chaîne

coulée = forcer le type d'un objet parce que vous en savez plus que le compilateur ex:

object obj = 3; 
int i = (int)obj; 
0

Here est un bon fil avec quelques exemples et réponses à votre question.

Questions connexes