2012-06-21 5 views
29
gefunden werden kann

ich folgenden Code habe, die ich in einem .NET 4.0 ProjektDer Typ oder Namespace-Name ‚T‘ nicht

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

aber immer folgende Fehler am kompilieren. Ich habe System.dll bereits standardmäßig in Referenzen enthalten. Was kann ich falsch machen?

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

Antwort

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

Wenn Sie sich nicht interessieren, wenn sein ein Erweiterungsmethode oder nicht, können Sie der Klasse einen generischen Contrain hinzufügen. Ich schätze, Sie wollen die Erweiterungsmethode.

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, ich hatte angenommen, Sie könnten keine generische statische Klasse erstellen. –

+0

@PaulPhillips - Ich habe es gerade versucht und ich glaube nicht, dass du es kannst. Ich habe diesen Teil der Antwort entfernt. – SwDevMan81

+0

Ich habe es in linqpad arbeiten, obwohl der Aufruf etwas ungeschickt ist. Sie müssen 'Utility .Filter()' –

41

Sie müssen das Argument type auf die Funktion selbst setzen.

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

Eine naive Frage, warum ist die Typinferenz nicht intelligent genug, um es herauszufinden? 'IEnumerable input' wird als Argument übergeben, daher ist' T' zur Ausführungszeit bekannt. – foresightyj

14

Sie müssen T erklären, die nach dem Methodennamen oder Klassennamen auftritt. Ändern Sie Ihre Methode Erklärung:

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