2013-03-01 17 views
7

To jest proste pytanie (mam nadzieję), istnieją generyczne i nietypowe metody w klasach kolekcji takich jak List<T>, które mają takie metody, jak Where i Where<T>.C# List Generic Extension Method vs Non-Generic

przykład:

 List<int> numbers = new List<int>() 
     { 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
     }; 

     IEnumerable<int> evens = numbers.Where((x) => 
     { 
      return x % 2 == 0; 
     }); 

     IEnumerable<int> evens2 = numbers.Where<int>((x) => 
     { 
      return x % 2 == 0; 
     }); 

co zastosować jeden nad drugim (generyczne lub nierodzajową)?

Odpowiedz

11

Są to ta sama metoda (dokumentacja here). Część parametru typu po nazwie metody (to jest w tym przypadku <int>) jest opcjonalna, gdy kompilator jest w stanie wywnioskować typ automatycznie i jednoznacznie z kontekstu. W tym przypadku metoda jest stosowana do obiektu implementującego interfejs IEnumerable<int> (tj. Obiekt numbers typu List<int>), z którego kompilator może bezpiecznie wywnioskować, że parametr typu to int.

Uwaga również, że Where<T> jest rzeczywiście metoda przedłużenie od klasy System.Linq.Enumerable, które mogą być stosowane do obiektów o dowolnej klasy wykonawczego IEnumerable<T> takich jak List<T>.

+0

Dzięki za jasne wyjaśnienie! – infbubble