Je crois que c'est en partie dû à la conception du compilateur. Eric Lippert blogged sur pourquoi champs ne peut pas utiliser la saisie implicite, et je soupçonne certains des mêmes arguments pour les méthodes.
Mais vous pourriez facilement vous retrouver avec une ambiguïté de toute façon. Par exemple:
var Method1(bool callMethod2)
{
return callMethod2 ? Method2() : null;
}
var Method2()
{
return Method1(false);
}
Quel devrait être le type ici?
Un exemple plus simple:
var Method1(bool throwException)
{
if (!throwException)
{
return Method1(true);
}
throw new Exception("Bang!");
}
Il est vrai que ce genre d'ambiguïté pourrait simplement être rejeté, mais je suspect que l'équipe de conception estimé que la complexité accrue de la conception et la mise en œuvre ne vaut pas le bénéfice . Ne pas oublier qu'ils fonctionnent avec des ressources limitées - donné un choix entre var
pour les méthodes et async/await
, je choisirais ce dernier en un clin d'œil. (Il est vrai qu'il ya d'autres fonctionnalités que je l'aurais cueillies au lieu de dynamic
, mais c'est une autre affaire ...)
Notez que le retour inférence de type est réalisée pour les expressions lambda, donc l'idée même de ce n'est pas fou. Par exemple:
IEnumerable<string> x = new[] { "x", "y", "z" };
var result = x.Select(s => { return s.Length; }); // Long form
Il le compilateur infère le type complet de l'expression lambda quand il effectue la résolution de surcharge sur Select
, la conversion à un Func<string, int>
. Il n'est pas inconcevable d'appliquer les mêmes idées à des méthodes - simplement compliquées.
Eh bien, si vous ne savez pas, comment le compilateur doit savoir? – leppie