2013-03-01 20 views
7

Questa è una semplice domanda (spero), ci sono metodi generici e non generici in classi di raccolta come List<T> che hanno metodi come Where e Where<T>.C# Elenco metodo di estensione generico vs non generico

Esempio:

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

Perché utilizzare uno sopra l'altro (generico o non generico)?

risposta

11

Sono lo stesso metodo (documentazione here). La porzione del parametro type dopo il nome del metodo (ad esempio, <int> in questo caso) è facoltativa quando il compilatore è in grado di dedurre il tipo automaticamente e inequivocabilmente dal contesto. In questo caso, il metodo viene applicato a un oggetto che implementa l'interfaccia IEnumerable<int> (ad esempio l'oggetto numbers di tipo List<int>) da cui il compilatore può dedurre che il parametro di tipo è int.

nota, inoltre, che Where<T> è in realtà un metodo estensione sulla classe System.Linq.Enumerable che può essere applicato ad oggetti di qualsiasi classe che implementa IEnumerable<T> come List<T>.

+0

Grazie per la chiara spiegazione! – infbubble