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