2013-07-25 12 views
9

Ho seguente codice che sto la compilazione in un NET 4.0 progettoMetodo di estensione. Il tipo o dello spazio dei nomi il nome 'T' non è stato trovato

public static class Ext 
{ 
    public static IEnumerable<T> Where(this IEnumerable<T> source, Func<T, bool> predicate) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 
     if (predicate == null) 
     { 
      throw new ArgumentNullException("predicate"); 
     } 
     return WhereIterator(source, predicate); 
    } 

    private static IEnumerable<T> WhereIterator(IEnumerable<T> source, Func<T, bool> predicate) 
    { 
     foreach (T current in source) 
     { 
      if (predicate(current)) 
      { 
       yield return current; 
      } 
     } 
    } 
} 

ma ottenendo i seguenti errori. Ho System.dll già incluso come predefinito nei riferimenti. Cosa potrei fare di sbagliato?

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

risposta

23

Prova:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) 

E

private static IEnumerable<T> WhereIterator<T>(IEnumerable<T> source, Func<T, bool> predicate) 

In breve, vi state perdendo la dichiarazione T generica (che tutti gli altri T di sono desunti dal) nella firma del metodo.

+0

Grazie anche a questo ho imparato qualcosa di nuovo. Stavo cercando di capire anche questo –

5

vi siete persi le definizioni di metodo generico:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    if (predicate == null) 
    { 
     throw new ArgumentNullException("predicate"); 
    } 
    return WhereIterator(source, predicate); 
} 

private static IEnumerable<T> WhereIterator<T>(IEnumerable<T> source, Func<T, bool> predicate) 
{ 
    foreach (T current in source) 
    { 
     if (predicate(current)) 
     { 
      yield return current; 
     } 
    } 
} 

Avviso del <T> dopo il nome del metodo.

Problemi correlati