Quelle est la différence entre les transtypages explicites et implicites?

Pouvez-vous s’il vous plaît expliquer la différence entre explicit moulages de types explicit et implicit ?

C’est un peu délicat car la syntaxe “cast” en C # fait en réalité une série de choses différentes (cast, conversion primitive, conversion sur mesure, etc.)

Dans une dissortingbution implicite, il y a une conversion évidente de conservation de la référence entre les deux:

 List l = new List(); IList il = l; 

Le compilateur peut prouver que ceci est sécurisé uniquement par l’parsing statique ( List est toujours un IList )

Avec une dissortingbution explicite, soit vous dites au compilateur que vous en savez plus que cela – “s’il vous plaît croyez-moi, mais vérifiez quand même”:

 List l = new List(); IList il = l; List l2 = (List)il; 

Bien que ce cast soit possible , le compilateur n’acceptera pas que tous les IList soient réellement List – nous devons donc lui dire de le laisser faire.


Dans une conversion primitive implicite (fournie par la spécification de langage), on suppose généralement qu’il existe une conversion sûre, non risquée, sans perte de données (avertissement: voir le commentaire de Jon):

 int i = 1; float f = i; 

Avec une conversion primitive explicite, il est probable que la conversion risque de perdre des données ou n’est pas évidente:

 float f = 1; int i = (int)f; 

Avec les opérateurs sur mesure, tous les paris sont désactivés et vous devrez consulter la documentation. Cela pourrait être une référence, ou cela pourrait être n’importe quoi . Il peut suivre des règles similaires à celles des conversions primitives (exemple: decimal ), ou il peut faire n’importe quoi au hasard:

 XNamespace ns = "http://abc/def"; // implicit XAtsortingbute atsortingb = GetAtsortingb(); int i = (int)atsortingb; // explicit (extracts text from atsortingb value and // parses to an int) 

Ces deux exécutent du code personnalisé spécifique au contexte.

Quelle est la différence entre le président des États-Unis et le président du Canada?

Comme il n’y a pas de président du Canada, il est difficile de répondre à la question. La bonne chose à faire est de repousser et de demander des éclaircissements sur la question. Par «le président du Canada», l’interlocuteur parle-t-il de la reine (chef de l’État), du gouverneur général (qui peut opposer son veto aux projets de loi) ou du premier ministre (qui fait effectivement fonction d’exécutif)? Difficile à dire sans clarification.

Et même avec des éclaircissements, c’est une question vague. Quelles différences voulez-vous connaître?

Comme il n’existe pas de “dissortingbution implicite” en C #, il est difficile de répondre à votre question. En C #, le casting est un opérateur. Je vais donc y revenir.

Voulez-vous dire “quelle est la différence entre une conversion explicite et une conversion implicite?” Ou avez-vous voulu poser des questions sur la sémantique de l’opérateur de dissortingbution? Ou la différence entre l’opérateur de dissortingbution et les autres opérateurs de conversion de type? Ou des situations dans lesquelles les opérateurs de dissortingbution peuvent être “implicitement” insérés dans votre code par le compilateur? (Par exemple, la boucle foreach et l’opérateur + = peuvent tous deux implicitement insérer une conversion invisible.)

Pouvez-vous clarifier la question? Quelles sont les deux choses que vous demandez de comparer et quelles sortes de différences vous intéressent?

Vous pourriez envisager de lire le chapitre “Conversions” de la spécification C #. Les chances sont bonnes que toutes les questions que vous avez sur les conversions y répondent.

 int i = 2; float a = i; // Implicit float b = (float)i; // Explicit 

Conversions explicites

Si une conversion ne peut être faite sans risque de perdre des informations, il s’agit d’une conversion explicite.

Par exemple –

 class ExplicitConversions { static void Main() { int x; double y = 6358.057; // Cast double to int. x = (int)y; System.Console.WriteLine(x); } } 

Conversions implicites

Si une conversion peut être effectuée sans risque de perte d’informations, il s’agit d’une conversion implicite. Aucune syntaxe spéciale n’est requirejse car la conversion est de type sécurisé et aucune donnée n’est perdue.

Par exemple –

 class ImplicitConversions { static void Main() { int x = 6714; double y; // Cast int to double. y = x; System.Console.WriteLine(y); } } 

Je pense que cet article explique le mieux.

Dissortingbution explicite:

 int x = 0; float y = 3.8f; x += (int) y; //Explicit cast. 

Cela indique au compilateur que la dissortingbution était intentionnelle et que vous savez que la partie fractionnaire sera perdue. Le compilateur ne se plaindra pas.

Dissortingbution implicite:

 int x = 0; float y = 3.8f; x += y; //Implicit cast 

Le compilateur se plaindra parce que la partie fractionnaire sera perdue lors de la conversion de float en int.

Explicite dans MSDN

Implicite dans MSDN

Une simple recherche donnera beaucoup d’informations sur le net.
différence entre type implicite et type explicite

Explicite de MSDN –

Si une opération de conversion peut provoquer des exceptions ou perdre des informations, vous devez la marquer explicite. Cela empêche le compilateur d’invoquer en silence l’opération de conversion avec des conséquences éventuellement imprévues.

Implicite de MSDN –

si la conversion est garantie pour ne pas provoquer de perte de données