Quelle est la différence entre la nouvelle Action() et un lambda?
Donc, quand j'écris quelque chose comme cela
Action action = new Action(()=>_myMessage = "hello");
Refactoriser Pro! Faits saillants le présent comme un redondante déléguer la création, et me permet de raccourcir
Action action = () => _myMessage="hello";
Et généralement cela fonctionne très bien. Généralement, mais pas toujours. Par exemple, le Rhinocéros se moque de a une méthode d'extension nommée à Faire:
IMethodOptions<T> Do(Delegate action);
Ici, en passant dans la première version fonctionne, mais le second ne l'est pas. Ce qui se passe exactement sous les couvertures ici?
- Votre deuxième bloc de code ne compile pas. Je reçois ce message "Impossible d'assigner une expression lambda à une implicitement de type de la variable locale". Mais, si je remplace le "var" par "Action" il ne.
- Oui, vous avez raison, il ne peut pas être attribué à une tapée implicitement variable, je vais le modifier.
Vous devez vous connecter pour publier un commentaire.
La première version est effectivement en train de faire:
Le problème que vous rencontrez est que le compilateur doit savoir quel type de délégué (ou de l'expression de l'arbre) l'expression lambda doit être convertie en. C'est pourquoi ce:
ne fait pas de compilation, il pourrait être tout délégué type sans paramètres et soit pas de valeur de retour ou le même type de retour comme
_myMessage
(ce qui est probablementstring
). Par exemple, tous ces éléments sont valables:Comment le compilateur C# de travailler sur ce type de
action
devait être, si elle était déclarée avecvar
?La façon la plus simple de contourner ce quand l'appel d'une méthode (pour votre Rhino se moque exemple) est à jeter:
new Action(() => ...)
dans ces cas.Avez-vous vérifié la deuxième ligne fait compile? Il ne devrait pas compiler, car C# ne prend pas en charge l'affectation d'une expression lambda à une tapée implicitement variable (CS0815). Cette ligne permettra de travailler dans VB.Net mais parce qu'il prend en charge anonyme déléguer la création (à partir de VB 9.0).
Le Rhino se moque de version ne compile pas pour la même raison, le deuxième ligne ne devrait pas compiler. C# ne sera pas automatiquement déduire un type pour une expression lambda. Les expressions Lambda doit être utilisé dans un contexte où il est possible de déterminer le type de délégué elles sont censées répondre. La première ligne fonctionne très bien parce que le type est clair: l'Action. Le Rhino se moque de version ne fonctionne pas parce que Délégué ressemble plus à un résumé de délégué. Il doit être en béton, type délégué tels que l'Action ou la touche Func.
Pour une discussion détaillée sur ce sujet, vous devriez lire Eric Lippert est des entrées de blog sur le sujet: http://blogs.msdn.com/ericlippert/archive/2007/01/11/lambda-expressions-vs-anonymous-methods-part-two.aspx
D'Action est un type spécial de délégué. Donc, si vous utilisez lambda ne sera pas à comprendre de quel type que vous souhaitez utiliser comme il ya beaucoup de (Action, Func,...).
À surmonter cette nécessité pour les acteurs (qui est lent dans la plupart des cas) vous pouvez modifier le paramètre de la base de la fonction de Délégué à l'Action:
De cette façon, vous pouvez utiliser les deux états a et n'aura aucun différent:
Si ce n'est pas possible alors je vous suggérons d'utiliser nouvelle Action(() => {}) au lieu de casting, il serait plus rapide.
Veuillez lire le lien suivant pour plus d'informations sur l'Action, et d'un Délégué: https://docs.microsoft.com/en-gb/dotnet/api/system.action?view=netframework-4.7.1#definition