Aby było tak czyste, jak to możliwe Chciałbym, aby kompilator wykonał całą pracę. Nie ma rzutów (więc jest właściwie bezpieczny). Nie są używane żadne biblioteki stron trzecich (System.Linq) (brak nakładu pracy środowiska wykonawczego).
public static IEnumerable<T> GetEnumerable<T>(this T[] arr)
{
return arr;
}
// I użyć kodu:
String[] arr = new String[0];
arr.GetEnumerable().GetEnumerator()
Dzieje przewagę jakiejś magii kompilatora, który utrzymuje wszystko czyste.
Inną kwestią, na którą należy zwrócić uwagę, jest to, że moja odpowiedź jest jedyną odpowiedzią, która przeprowadzi kontrolę podczas kompilacji.
Dla każdego innego rozwiązania, jeśli zmieni się typ "arr", kod wywołujący zostanie skompilowany i zakończy się niepowodzeniem w środowisku wykonawczym, co spowoduje błąd środowiska wykonawczego.
Moja odpowiedź spowoduje, że kod się nie skompiluje, a zatem mam mniejsze szanse na wysłanie błędu w moim kodzie, ponieważ może to sygnalizować, że używam niewłaściwego typu.
Kod LINQy faktycznie zwraca moduł wyliczający dla wyniku metody Cast, a nie moduł wyliczający dla tablicy ... – Guffa
Guffa: ponieważ moduły wyliczające zapewniają tylko dostęp tylko do odczytu, nie jest to duża różnica pod względem użycia. –
Jak sugeruje @Mehrdad, użycie 'LINQ/Cast' ma zupełnie inne zachowanie środowiska wykonawczego, ponieważ ** każdy element tablicy ** zostanie przekazany przez dodatkowy zestaw cyklicznych wyliczeń' MoveNext' i 'Current', i może to wpłynąć na wydajność, jeśli macierz jest ogromna. W każdym razie problem można całkowicie i łatwo uniknąć przez uzyskanie odpowiedniego modułu wyliczającego (tj. Za pomocą jednej z dwóch metod przedstawionych w mojej odpowiedzi). –