2013-07-25 14 views
9

Mam następujący kod, który mam kompilacji w .NET 4.0 projektuMetoda przedłużenia. Typu lub obszaru nazw „T” nie można znaleźć

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

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

23

Spróbuj:

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

I

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

W skrócie, tracisz deklarację T rodzajowe (co wszystkie pozostałe T są wywnioskować) w sygnaturze metody.

+0

Teraz dowiaduję się też czegoś nowego. Próbowałem też wymyślić to –

5

przegapiłeś ogólnych definicji metoda:

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

zauważy <T> po nazwie metody.

Powiązane problemy