2010-11-15 13 views
11

Perché il compilatore C# non deduce il fatto che FooExt.Multiply() soddisfi la firma di Functions.Apply()? Devo specificare una variabile delegata separata di tipo Func<Foo,int,int> affinché il codice funzioni ... ma sembra che l'inferenza di tipo dovrebbe gestirlo. Ho sbagliato? E se sì, perché?Perché il compilatore C# non deduce automaticamente i tipi in questo codice?

EDIT: L'errore di compilazione ricevuto è:

Gli argomenti di tipo per il metodo FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, T2)' non possono essere dedotte dal utilizzo. Prova a specificare gli argomenti di tipo esplicitamente

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

Quanto segue dovrebbe funzionare anche: 'x.Apply (new Func (FooExt.Multiply), 5)'. Qual è l'errore di compilazione? – thecoop

+1

Sembra compilare bene per me, in. NET 4.0. –

+0

possibile duplicato di inferenza di tipo generico [C# 3.0 - passaggio di un delegato come parametro di funzione] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a-delegate- parametro as-a-function) – thecoop

risposta

5

Credo che questo sia il risultato dell'incapacità VS2008 C# del compilatore di dedurre correttamente i tipi coinvolti durante la conversione di un gruppo di metodo per un delegato. @Eric Lippert discute questo comportamento nel suo post C# 3.0 Return Type Inference Does Not Work On Method Groups.

Se ricordo correttamente, sono stati apportati alcuni miglioramenti nel nuovo compilatore C# che fa parte di VS2010 che espande i casi in cui è possibile l'inferenza del gruppo metodo.

Ora, le regole per l'inferenza di tipo sono piuttosto complicate e io sono lontano da un esperto in questo argomento. Spero che qualcuno con una vera conoscenza possa rispondere a questa domanda se mi sbaglio.

+0

L'analisi è corretta. –

+0

@Eric Lippert: Grazie per la conferma. A proposito, pensavo di ricordarti di blogging sui miglioramenti per digitare inferenza nell'ultimo compilatore C#, ma non riesco a trovare alcun articolo sul tuo blog in tal senso ... forse l'ho immaginato. – LBushkin

+0

Ho detto che stavamo per risolverlo, qui: http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx –

Problemi correlati