2011-11-10 3 views

Répondre

3

Je pense que cela se produit parce que lorsque vous utilisez d += "???"; d est converti en chaîne (en utilisant la méthode par défaut ToString() qui prend le nom d'objet) puis « ??? » est ajouté et écrit à la console.
Si vous essayez d'utiliser d += 2, cela échoue car il n'existe aucun moyen par défaut pour convertir une action en nombre entier. Idem pour les autres types ...

+0

si j'utilise un autre type pour 'a' il donnerait une exception –

+0

@OrlandoWilliam: oui, bien sûr. La raison en est (j'ai essayé d'expliquer dans ma réponse, peut-être que je n'étais pas clair, désolé) qu'il n'y a pas de _ _ convertisseur "_ entre Action et d'autres types mais la chaîne ... – Marco

+0

@OrlandoWilliam: Non ce ne serait pas. Tout objet peut être converti en chaîne de cette manière. Essayez: 'object a = 2; a + = "???"; Console.WriteLine (a); ', par exemple. – StriplingWarrior

2

L'ajout d'un string à n'importe quoi dans .NET provoquera l'appel de la méthode .ToString de cet objet et traitera l'ajout comme une concaténation de chaîne. La même chose se produirait si vous n'utilisiez pas un dynamic.

Action a = new Action(() => Console.WriteLine()); 
Console.WriteLine(a + "???"); // outputs "System.Action???" 

Tout Action retournera System.Action lorsque sa méthode .ToString est appelée.

La seule différence entre += dans l'exemple d'origine et + dans cet exemple est que vous définissez le résultat de la concaténation dans la variable dynamique. Il serait équivalent à:

object a = new Action(() => Console.WriteLine()); 
a = a + "???"; // The same as: a = a.ToString() + "???"; 
Console.WriteLine(a); 
+0

le compilateur ne le permettrait pas si je n'utilisais pas la dynamique –

+0

@OrlandoWilliam: Bien sûr que si vous lanciez 'd' comme objet à la place. Voir ma mise à jour – StriplingWarrior

+0

vous avez raison, j'ai changé quelque chose d'autre en vérifiant d'autres choses c'est pourquoi il a jeté l'exception –

Questions connexes