2012-06-21 9 views
29

Mam następujący kod, który mam opracowującym w .NET 4.0 projektutypu lub nazwa przestrzeni nazw „T” nie można znaleźć

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

ale coraz następujące błędy. Mam System.dll już włączone jako domyślny w referencjach. Co mogę robić źle?

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

Odpowiedz

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

przypadku jeśli jego esz dont care Metoda rozszerzenia, czy nie, możesz dodać ogólne ograniczenie do klasy. Domyślam się, że chcesz metodę rozszerzenia.

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, założyłem, że nie można utworzyć statycznej klasy ogólnej. –

+0

@PaulPhillips - I rzeczywiście tak spróbowałem i nie sądzę że można. Usunąłem tę część odpowiedzi. – SwDevMan81

+0

Dostałem go do pracy w LINQPad, chociaż powołanie jest trochę niezdarny. Trzeba zrobić 'Utility .Filter()' –

41

Musisz wpisać argument typu na samej funkcji.

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

Naiwne pytanie, dlaczego wnioskowanie o typie nie jest wystarczająco inteligentne, aby to zrozumieć? 'IEnumerable input' jest przekazywana jako argument, więc' T' jest znany w czasie wykonywania. – foresightyj

14

Musisz zadeklarować T, który występuje po nazwie metody lub nazwa klasy. Zmień swoją deklarację metody do:

public static IEnumerable<T> 
    Filter1<T>(this IEnumerable<T> input, Func<T, bool> predicate) 
Powiązane problemy