Щоб зробити це максимально чистим, я люблю дозволяти компілятору виконувати всю роботу. Немає зліпків (тому насправді безпечно для типу). Не використовуються сторонні бібліотеки (System.Linq) (відсутність накладних витрат на виконання).
public static IEnumerable<T> GetEnumerable<T>(this T[] arr)
{
return arr;
}
// А для використання коду:
String[] arr = new String[0];
arr.GetEnumerable().GetEnumerator()
Це використовує певну магію компілятора, яка підтримує все в чистоті.
Інший момент, на який слід звернути увагу, полягає в тому, що моя відповідь - це єдина відповідь, яка буде перевіряти час компіляції.
Для будь-якого іншого рішення, якщо тип "arr" змінюється, тоді код виклику буде скомпільований і не виконатиметься під час виконання, що призведе до помилки виконання.
Моя відповідь призведе до того, що код не буде скомпільований, і тому у мене менше шансів надіслати помилку в моєму коді, оскільки це буде сигналом для мене, що я використовую неправильний тип.