2010-11-15 18 views
11

Pourquoi le compilateur C# ne déduit pas le fait que FooExt.Multiply() satisfait la signature de Functions.Apply()? Je dois spécifier une variable de délégué distincte de type Func<Foo,int,int> pour que le code fonctionne ... mais il semble que l'inférence de type devrait gérer cela. Ai-je tort? Et si oui, pourquoi?Pourquoi le compilateur C# ne déduit-il pas automatiquement les types dans ce code?

EDIT: L'erreur de compilation reçu est:

Les arguments de type pour la méthode FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, T2)' ne peuvent pas être déduites de l'utilisation. Essayez préciser les arguments de type explicitement

namespace FirstClassFunctions { 
    public class Foo { 
     public int Value { get; set; } 

     public int Multiply(int j) { 
      return Value*j; 
     } 
    } 

    public static class FooExt { 
     public static int Multiply(Foo foo, int j) { 
      return foo.Multiply(j); 
     } 
    } 

    public static class Functions { 
     public static Func<TR> Apply<T1,T2,TR>(this T1 obj, 
               Func<T1,T2,TR> f, T2 val) { 
      return() => f(obj, val); 
     } 
    } 


    public class Main { 
     public static void Run() { 
      var x = new Foo {Value = 10}; 
      // the line below won't compile ... 
      var result = x.Apply(FooExt.Multiply, 5); 
      // but this will: 
      Func<Foo, int, int> f = FooExt.Multiply; 
      var result = x.Apply(f, 5); 
     } 
    } 
+0

Ce qui suit devrait également fonctionner: 'x.Apply (nouveau Func (FooExt.Multiply), 5)'. Quelle est l'erreur de compilation? – thecoop

+1

Il semble compiler bien pour moi, dans .NET 4.0. –

+0

duplication possible de [inférence de type générique C# 3.0 - transmission d'un délégué en tant que paramètre de fonction] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a-delegate- as-a-function-parameter) – thecoop

Répondre

5

Je crois que c'est le résultat de la VS2008 C# l'incapacité du compilateur de déduire correctement les types impliqués lors de la conversion d'un groupe de méthode pour un délégué. @Eric Lippert discute de ce comportement dans son article C# 3.0 Return Type Inference Does Not Work On Method Groups. Si je me souviens bien, certaines améliorations ont été apportées au nouveau compilateur C# qui fait partie de VS2010, ce qui étend les cas où l'inférence de groupe de méthodes est possible. Maintenant, les règles pour l'inférence de type sont assez compliquées, et je suis loin d'être un expert dans ce domaine. J'espère que quelqu'un avec une vraie connaissance peut répondre à cette question si je me trompe.

+0

Votre analyse est correcte. –

+0

@Eric Lippert: Merci pour la confirmation. BTW, je pensais vous rappeler que vous bloguer sur les améliorations apportées à l'inférence de type dans le dernier compilateur C#, mais je ne peux pas trouver d'article sur votre blog à cet effet ... peut-être que je l'imaginais. – LBushkin

+0

J'ai mentionné que nous allions le réparer, ici: http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx –