Une expression Linq simple ne comstackra pas

Ayant ces définitions de base

bool MyFunc(ssortingng input) { return false; } var ssortingngs = new[] {"aaa", "123"}; 

Je me demande pourquoi cela ne comstack pas:

 var b = ssortingngs.Select(MyFunc); 

Mais cela va:

 var c = ssortingngs.Select(elem => MyFunc(elem)); 

Le message d’erreur est “Les arguments de type de la méthode ‘System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func)’ ne peuvent pas être déduits de l’utilisation.”

Le conseil d’erreur Resharper indique qu’il est confus entre

 Select(this IEnumerable, Func) 

et

 Select(this IEnumerable, Func) 

… mais la signature pour MyFunc est claire – il suffit d’un paramètre (chaîne).

Quelqu’un peut-il faire la lumière ici?

L’inférence de type générique a légèrement changé – en termes de mise en œuvre – entre les compilateurs C # 3 et C # 4. Voici un exemple de programme court mais complet:

 using System; using System.Linq; class Test { static void Main() { ssortingng[] ssortingngs = { "a", "b" }; var results = ssortingngs.Select(MyFunc); } static bool MyFunc(ssortingng input) { return true; } } 

Cela comstack avec le compilateur C # dans .NET 4, mais pas celui dans .NET 3.5.

Je pense qu’il est raisonnable d’appeler cela une correction de bogue, car je ne pense pas que c’était un changement de spécification.

Si vous devez utiliser le compilateur à partir de .NET 3.5, vous pouvez append une dissortingbution pour clarifier:

 var results = ssortingngs.Select((Func) MyFunc); 

ou

 var results = ssortingngs.Select(new Func(MyFunc)); 

ou vous pouvez rendre l’argument de type explicite:

 var results = ssortingngs.Select(MyFunc); 

Jon est bien sûr correct comme d’habitude. Quelques informations supplémentaires:

Voici l’article de blog de 2007 où je décris le problème que vous rencontrez:

http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

Sur la base des retours sur cet article, nous avons décidé de résoudre ce problème, mais nous n’avons pas pu mettre le correctif à jour dans C # 3 pour des raisons de planification.

Quelques mois plus tard, j’ai annoncé que le correctif serait placé dans C # 4 et non dans le service pack C # 3:

http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx