2012-06-21 3 views
29

Я следующий код, который я компиляции в проекте .NET, 4,0тип или пространство имен «T» не может быть найдено

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

но получить следующие ошибки. У меня System.dll уже включен в качестве ссылок по умолчанию. Что я могу делать неправильно?

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

ответ

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

Если вы не осторожны, если сво расширения или нет, вы можете добавить общий класс к классу. Я предполагаю, что вы хотите использовать метод расширения.

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, я предположил, что вы не можете создать общий статический класс. –

+0

@PaulPhillips - Я на самом деле просто попробовал, и я не думаю, что вы можете. Я удалил ту часть ответа. – SwDevMan81

+0

Я получил его, чтобы работать в linqpad, хотя вызов довольно неуклюжий. Вы должны сделать 'Утилиту .Filter()' –

41

Вы должны поместить аргумент типа непосредственно в функцию.

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

Наивный вопрос, почему не такой вывод типа достаточно умный, чтобы понять это? 'IEnumerable input' передается как аргумент, поэтому' T' известен во время выполнения. – foresightyj

14

Вы должны объявить T, которое происходит после имени метода или имя класса. Изменить объявление метода для:

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