2012-06-21 19 views
29

Ben .NET 4.0 projetür veya ad alanı adı '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; 
       } 
      } 
     } 
    } 
} 

içinde derleme am kod aşağıdaki ancak şu hataları gitmeyi istesem bulunamadı. Kaynaklarda zaten varsayılan olarak bulunan System.dll var. Ne yapıyorum yanlış?

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

cevap

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

:

İşte
IEnumerable<yourObject> 

sahip

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

+1, Statik bir sınıf jenerik yapamayacağınızı varsaymıştım. –

+0

@PaulPhillips - Aslında bunu denedim ve yapabileceğinizi düşünmüyorum. Cevabın bu bölümünü kaldırdım. – SwDevMan81

+0

Telefon görüşmesinde linqpad'de çalıştım, ancak arama biraz rahatsızlık verici. Faydalı .Filter() ' –

41

Tür bağımsız değişkenini işlevin kendisine koymak zorundasınız.

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

Bir naif soru, neden çıkarım yapabilecek kadar akıllı değil mi? IEnumerable girişi 'bir argüman olarak iletildi, bu nedenle' T 'yürütme zamanında biliniyor. – foresightyj

2

< T> nesnesi türü anlamına bilgi: için yöntem bildirimi değiştirin Uzantı yöntemi veya değil, sınıfa genel bir kısıtlama ekleyebilirsiniz. Tahminim uzatma yöntemini istiyorsun.

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) 
    { 
İlgili konular