Pour le rendre aussi propre que possible, j'aime laisser le compilateur faire tout le travail. Il n'y a pas de moulages (donc c'est en fait sûr de type). Aucune bibliothèque tierce (System.Linq) n'est utilisée (aucune surcharge d'exécution).
public static IEnumerable<T> GetEnumerable<T>(this T[] arr)
{
return arr;
}
// Et pour utiliser le code:
String[] arr = new String[0];
arr.GetEnumerable().GetEnumerator()
Cela tire parti de la magie du compilateur qui garde tout propre.
L'autre point à noter est que ma réponse est la seule réponse qui fera une vérification au moment de la compilation.
Pour toutes les autres solutions, si le type de "arr" change, alors le code d'appel sera compilé et échouera à l'exécution, ce qui provoquera un bogue d'exécution.
Ma réponse fera que le code ne se compilera pas et donc j'ai moins de chance d'envoyer un bogue dans mon code, car cela me signifierait que j'utilise le mauvais type.