2012-06-21 32 views
29

He siguiente código que soy compilar en un proyecto .NET 4,0El tipo o el nombre de espacio de nombres 'T' no se pudo encontrar

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; 
       } 
      } 
     } 
    } 
} 

pero conseguir siguientes errores. Tengo System.dll ya incluido como predeterminado en las referencias. ¿Qué puedo estar haciendo mal?

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?) 

Respuesta

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

Si no te importa si es una método de extensión o no, puede agregar una restricción genérica a la clase. Supongo que quieres el método de extensión.

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, asumí que no se podía hacer una clase estática genérica. –

+0

@PaulPhillips - De hecho, lo probé y no creo que puedas. Eliminé esa parte de la respuesta. – SwDevMan81

+0

Lo tengo para trabajar en linqpad, aunque la llamada es un poco torpe. Tienes que hacer 'Utility .Filter()' –

41

Tiene que poner el argumento de tipo en la función en sí.

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

Una pregunta ingenua, ¿por qué no es el tipo de inferencia lo suficientemente inteligente como para resolverlo? 'IEnumerable input' se pasa como un argumento, por lo que' T' se conoce en el momento de la ejecución. – foresightyj

14

tiene que declarar T, que se produce después de que el nombre del método o el nombre de la clase. Cambiar su declaración de método a:

public static IEnumerable<T> 
    Filter1<T>(this IEnumerable<T> input, Func<T, bool> predicate) 
Cuestiones relacionadas