67 votes

Quelle est la différence entre le casting et de conversion ?

Observations de Eric Lippert dans cette question m’ont laissé complètement confus. Quelle est la différence entre le casting et la conversion en c# ?

80voto

chrissr Points 5622

Casting est une manière de dire le compilateur « objet X est vraiment Type Y, allez-y et traiter comme tel. »

Conversion est en disant « Je sais objet X n’est pas de Type Y, mais il existe un moyen de créer un nouvel objet de X de Type Y, aller de l’avant et le faire. »

45voto

Justin Niessner Points 144953

Je crois qu'Eric est en train de dire est:

La coulée est un terme décrivant la syntaxe (d'où le Syntaxiques sens).

La Conversion est un terme décrivant quelles mesures sont effectivement prises en coulisses (et donc la Sémantique de la signification).

Fonte de l'expression est utilisée pour convertir les explicitement une expression donnée type.

Et

Fonte expression de la forme (T)E, où T est un type, et E est un unaire-expression, effectue une explicite de conversion (§13.2) de la valeur de E de type T.

Semble sauvegardez-la en disant qu'un opérateur de cast dans la syntaxe effectue une conversion explicite.

42voto

Eric Lippert Points 300275

Je me souviens de l'anecdote racontée par Richard Feynman, où il est d'assister à une philosophie de la classe et le professeur lui pose "de Feynman, vous êtes un physicien, à votre avis, est un électron d'un 'objet essentiel'?" Afin de Feynman pose la question de clarification "est une brique essentielle de l'objet?" à la classe. Chaque élève a une réponse différente à cette question. Ils disent que les fondamentaux de la notion abstraite de "brickness" est l'objet essentiel. Non, un seul, l'unique, la brique est l'objet essentiel. Non, les pièces de la brique, vous pouvez observer empiriquement est l'objet essentiel. Et ainsi de suite.

Ce qui est bien sûr de ne pas répondre à votre question.

Je ne vais pas aller par le biais de tous ces douzaine de réponses et débat avec leurs auteurs au sujet de ce que je voulait vraiment dire. Je vais écrire un article de blog sur le sujet dans quelques semaines et nous allons voir si ça en jette quelque lumière sur la question.

Comment sur une analogie si, à la Feynman. Vous souhaitez faire cuire une miche de pain à la banane samedi matin (comme je le fais presque tous les samedis matin.) Alors, vous demandez la Joie de La Cuisson, et il dit "bla bla bla... Dans un autre bol, fouetter ensemble les ingrédients secs. ..."

Manifestement, il ya une forte relation entre l'instruction et de vos actions, demain matin, mais il est tout aussi évident que ce serait une erreur de confondre l' instruction avec l' action. L'instruction se compose de texte. Il a une place, sur une page en particulier. Il a des signes de ponctuation. Étiez-vous d'être dans la cuisine, fouetter ensemble la farine et le bicarbonate de soude, et quelqu'un a demandé "quel est votre signe de ponctuation à l'instant?", vous penseriez probablement que c'était une drôle de question. L'action est liée à l'instruction, mais le texte propriétés de l'instruction ne sont pas des propriétés de l'action.

Une fonte est pas une conversion de la même manière qu'une recette n'est pas la loi de la cuisson d'un gâteau. Une recette est un texte qui décrit une action, que vous pouvez ensuite effectuer. Un opérateur de cast est un texte qui décrit une action - un de conversion - dont l'exécution peut alors effectuer.

7voto

Jason Punyon Points 21244

Le C# Spec 14.6.6:

Fonte de l'expression est utilisée pour convertir les explicitement une expression donnée type.
...
Fonte expression de la forme (T)E, où T est un type, et E est un unaire-expression, effectue une explicite de conversion (§13.2) de la valeur de E de type T.

Si le casting est une construction syntaxique utilisé pour indiquer au compilateur d'invoquer des conversions explicites.

Le C# Spec §13:

Une conversion permet une expression de un type à être traité comme un autre type. Les Conversions peuvent être implicites ou explicite, et cela détermine si un cast explicite est nécessaire. [Exemple: Par exemple, la conversion de type int de type long est implicite, de sorte que les expressions de type int peut implicitement être traitées en tant que type long. La conversion inverse, à partir de type de long de type int, est explicite, donc un cast explicite est nécessaire.

Afin de faire des conversions où le travail est fait. Vous remarquerez que la fonte de l'expression citation dit qu'il effectue les conversions explicites, mais explicite, les conversions sont un sur-ensemble de conversions implicites, de sorte que vous pouvez également appeler des conversions implicites (même si vous n'avez pas à) par l'intermédiaire de la fonte des expressions.

6voto

Oded Points 271275

Juste ma compréhension, sans doute beaucoup trop simple :

Quand la coulée les données essentielles reste intacte (même représentation interne) - « Je sais il s’agit d’un dictionnaire, mais vous pouvez l’utiliser comme un ICollection ».

Lors de la conversion, vous modifiez la représentation interne à autre chose - « je veux cet int être une chaîne ».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X