Conjeturaría que string.join requiere la capacidad de iterar a través de la matriz dos veces (una vez para medir la longitud, y una vez para hacer la copia). Algunas clases que implementan iEnumerable se pueden unir con éxito en una matriz de cadenas haciendo una pasada para contar la longitud, llamando a Restablecer en el enumerador y utilizando una segunda pasada para copiar los datos, pero como iEnumerable no admite ni una propiedad de Capacidades ni una familia de clases derivadas como iMultiPassEnumerable, las únicas formas en que String.Join podría aceptar con seguridad un iEnumerable sería (1) enumerar a algún tipo de lista y ejecutar la combinación en eso, (2) adivinar el tamaño de cadena de destino y reasignar como necesario, o (3) combinar los enfoques, agrupando cadenas cortas en grupos de hasta, por ejemplo, 8K, y luego combinar todos los clústeres en un resultado final (que sería una mezcla de clústeres preconcabados y cadenas largas de la matriz original).
Si bien me gustaría decir que sería útil para String.Join incluir una sobrecarga que convierta un iEnumerable en una lista, no veo que brinde más eficiencia que la conversión manual (a diferencia del versión de matriz de String.Join, que es más eficiente que unir cadenas manualmente de forma individual).
Te complacerá saber que acepta 'IEnumerable' en.NET 4 –
Supongo que se agregó antes de que existiera IEnumerable. – asawyer
string.Join estuvo aquí mucho antes que Linq. ¿Cómo te molesta? Solo quedan unos pocos caracteres más para escribir. –