2010-11-09 7 views

Répondre

12

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.

+4

Votre analyse est, comme d'habitude, sur place. Faire cette fonctionnalité correctement nécessite * l'analyse complète du programme *, qui a des impacts majeurs sur l'architecture et la performance du compilateur. En outre, toutes les raisons de "no var on fields" s'appliquent. Par exemple, nous n'avons pas de manière standardisée de représenter un type anonyme dans une API publique. Si vous voulez une langue qui offre ce genre d'inférence de type, essayez F #. –

2

var n'est PAS un type de données en C#. C'est pourquoi vous ne pouvez pas l'utiliser comme paramètre de retour. Le compilateur déduit le type au moment de la compilation du côté droit de l'assignation et en gardant à l'esprit qu'il est connu au moment de la compilation que vous devez utiliser le type réel comme valeur de retour. En C# 4.0, vous pouvez utiliser le type dynamic:

public dynamic myFunction() 
{ 
    var = some operations 
} 
+0

-1, car ce qui est proposé est simplement que le compilateur devrait déduire quel est le type de retour réel ... faire une déclaration qui utilise 'var' équivalent à la même déclaration de méthode avec un type de retour explicite, déduit des instructions de retour le corps de la méthode. Ce n'est pas inconcevable - juste compliqué. Notez que c'est déjà fait pour les expressions lambda, comme dans l'exemple de ma réponse. –

-2

Je pense que il pourrait gâcher les règles de surcharge de la méthode.

Questions connexes