2013-06-12 16 views
6

Przepraszam, jeśli zadaję głupie pytanie, ale czy ktoś może wyjaśnić różnicę między następującymi dwoma połączeniami (ToArray). W intellisense nie pokazuje ich jako przeciążonych metod oczywiście wynik obu wywołań jest taki sam.Różnica między ToArray() i ToArray <int>();

List<int> i = new List<int> { 1, 2, 5, 64 }; 
int[] input = i.Where(j => j % 2 == 1).ToArray(); 
input = i.Where(j => j % 2 == 1).ToArray<int>(); 

Odpowiedz

5

Nie ma tutaj różnicy. W pierwszym wywołaniu kompilator wywnioskował typ int, natomiast w drugim określono go jawnie.

Może się zdarzyć, że typ jest konieczny, ponieważ nie można go wywnioskować. Na przykład masz niestandardową kolekcję, która dwukrotnie implementuje IEnumerable<T> dla dwóch różnych typów T. To boli użyteczność, dlatego lepiej unikać takich konstrukcji.

4

Jest to ta sama ogólna metoda. W pierwszym przypadku ogólny parametr typu jest wywnioskowany przez kompilator z ogólnego parametru typu wyliczenia, który wywołujemy pod numerem ToArray<T>(). Ale możesz również wyraźnie to określić.

3

To są to samo. Jesteś świadkiem tego, co nazywa się "wnioskiem o typ". W niektórych scenariuszach kompilator C# może wykryć typ na podstawie przekazanych parametrów i nie trzeba jawnie określać parametrów typu. W twoim przykładzie wiadomo, że i to IEnumerable<int>, a zatem .ToArray() może wywnioskować parametr int.

Tu jest ładny artykuł, który przechodzi w tym w głębi: http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

5

Nie ma różnicy, to jest dokładnie ten sam sposób ToArray(). Kompilator może po prostu wywnioskować, że chcesz, aby wersja ToArray<int> pochodziła ze składni wyrażenia. Wartość zwracana Where() została wywnioskowana, aby zwrócić int. Innymi słowy, używa on Where<int>(). Który został wywnioskowany z rodzaju listy <>. Więc może wywnioskować, że potrzebujesz ToArray<int>.

Więc łańcuch wnioskowania typu to List<int> =>Where<int>() => .

Zmień listę na, powiedzmy, List<long>, a wyrażenie nadal działa bez konieczności modyfikowania.

2

Bez różnicy.

int[] input = i.Where(j => j % 2 == 1).ToArray(); 

Tutaj tylko kompilator wywodząc się T ogólny argument oparty na typie przeliczalny zadzwonić ToArray() dalej.

input = i.Where(j => j % 2 == 1).ToArray<int>(); 

Tutaj, wartość zwracana Where() jest wywnioskować przez kompilator, aby powrócić int.

  • ToArray<T>() jest Ogólny, aby mógł działać na dowolnym IEnumerable<T>.
  • ToArray() faktycznie tylko przekierowuje do domyślnej interpretacji ToArray<T>() na podstawie T źródła IEnumerable.
  • Jeśli wywołasz ogólną metodę i nie podasz żadnych argumentów typu, kompilator spróbuje je za ciebie wyprowadzić.
Powiązane problemy