2012-06-21 1 views
29

Ho seguente codice che sto la compilazione in un NET 4.0 progettoIl tipo o il nome del namespace 'T' non è stato trovato

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

     } 
    } 

    public static class Utility 
    { 
     public static IEnumerable<T> Filter1(this IEnumerable<T> input, Func<T, bool> predicate) 
     { 
      foreach (var item in input) 
      { 
       if (predicate(item)) 
       { 
        yield return item; 
       } 
      } 
     } 
    } 
} 

ma ottenendo i seguenti errori. Ho System.dll già incluso come predefinito nei riferimenti. Cosa potrei fare di sbagliato?

Error 1 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error 2 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

Error 3 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

risposta

28
public static class Utility 
{ 
    public static IEnumerable<T> Filter1<T>(// Type argument on the function 
     this IEnumerable<T> input, Func<T, bool> predicate) 
    { 

Se non vi preoccupate se un metodo di estensione o no, è possibile aggiungere un vincolo generico alla classe. La mia ipotesi è che tu voglia il metodo di estensione.

public static class Utility<T> // Type argument on class 
{ 
    public static IEnumerable<T> Filter1(// No longer an extension method 
     IEnumerable<T> input, Func<T, bool> predicate) 
    { 
+0

+1, avevo pensato che non si potesse fare una classe statica generica. –

+0

@PaulPhillips - In realtà ho appena provato e non penso che tu possa. Ho rimosso quella parte della risposta. – SwDevMan81

+0

Ho capito che funziona in linqpad, anche se la chiamata è piuttosto goffa. Devi fare 'Utility .Filter()' –

41

Devi mettere l'argomento tipo sulla funzione stessa.

public static IEnumerable<T> Filter1<T>(...) 
+0

Una domanda ingenua, perché non è il tipo di inferenza abbastanza intelligente da capirlo? 'IEnumerable input' viene passato come argomento, quindi' T' è noto al momento dell'esecuzione. – foresightyj

14

è necessario dichiarare T, che si verifica dopo il nome del metodo o il nome della classe. Cambia la tua dichiarazione di metodo per:

public static IEnumerable<T> 
    Filter1<T>(this IEnumerable<T> input, Func<T, bool> predicate) 
Problemi correlati