question intéressante.
D'abord, considérons la différence entre les méthodes anonymes et les lambdas. Du point de vue du rédacteur du compilateur, la différence la plus importante est que lambdas peut exiger que le compilateur infère le type des paramètres de la cible à laquelle le lambda est assigné; Les méthodes anonymes C# 2 n'ont pas cette fonctionnalité. Cette fonctionnalité semble être une petite différence mais en fait, elle a des ramifications majeures sur l'implémentation du compilateur. Voir ma série de blog sur ce sujet pour quelques réflexions sur les raisons qui est:
http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx
nous donc maintenant de venir à votre question réelle: pourquoi ne pas déduire extériorité/refness du type de cible aux paramètres du lambda. Autrement dit, si nous avons un délégué D (out int x) alors sûrement D d = x => {x = 10; } pourrait déduire que x est "out int".
Il n'y a pas de raison technique pour laquelle je ne sais pas pourquoi nous ne pourrions pas faire cela. En interne dans le compilateur, les types out/ref sont représentés comme des types comme les autres.
Cependant, les fonctionnalités ne sont pas réalisées uniquement parce qu'elles peuvent être réalisées; ils se font parce qu'il y a une raison impérieuse de le faire.Pour les lambdas, la raison impérieuse de faire une inférence de type en premier lieu est LINQ; nous voulons être en mesure de faire une transformation syntaxique simple sur une compréhension de requête dans un appel de méthode avec lambdas, et laisser le moteur d'inférence de type de méthode élaborer les types de tous les paramètres lambda. Aucune des méthodes LINQ générées n'a de délégué avec des paramètres out ou ref.
Donc, nous n'avons aucune raison impérieuse de faire la fonctionnalité. Les délégués qui ont des paramètres out/ref sont relativement rares. Et l'attribution de lambdas à ces délégués est encore plus rare. Donc, c'est une fonctionnalité dont nous n'avons pas besoin, et qui ne profite presque à personne.
C# 3 était le «pôle long» de l'horaire Visual Studio; nous avons eu le plus grand nombre de jours de travail prévus pour toute équipe qui expédie un composant dans VS. Cela signifiait que tous les jours nous avons glissé l'horaire, l'ensemble division glissé. Cela a fortement découragé de consacrer du temps à des fonctions inutiles qui n'ont profité à personne. Donc le travail n'a jamais été fait. Je suis d'accord que ce serait bien d'être plus cohérent ici, mais il est peu probable que cela se produise. Nous avons beaucoup de priorités plus élevées.
Je suis curieux à ce sujet moi-même. Espérons qu'Eric Lippert remarquera ce post ... il est le plus susceptible de donner une réponse significative à cela. – LBushkin
LBushkin, si vous voulez apporter quelque chose à mon attention, vous pouvez toujours me l'envoyer via le lien de contact sur mon blog. –
Pour les méthodes anonymes avec le mot-clé 'delegate', la règle est que vous ne spécifiez rien (omettez même la parenthèse'() ') ou spécifiez la signature complète incluant les types de paramètres et les modificateurs comme' ref'/'out'. Donc 'ref' /' out' ne fait pas exception. Pour les lambdas, ton idée a du sens, mais je ne suis pas sûre si je pense que c'est une bonne idée. La syntaxe '(out t) => {...}' donne l'impression que "out" est le type du paramètre. Alors 't => {...}' est meilleur, mais il pourrait être "dangereux" si quelqu'un oublie la signification de 'D' et édite le corps' {...} 'du lambda sans réaliser le' out' nature de 't'. –