Estoy buscando una manera fácil de clonar un parámetro IEnumerable<T>
para referencia futura. El método de extensión ToArray
de LINQ parece una forma agradable y concisa de hacer esto.¿Puedo confiar en que LINQ ToArray() siempre devuelve una nueva instancia?
Sin embargo, no tengo claro si siempre se garantiza que devolverá una nueva instancia de matriz. Varios de los métodos LINQ verificarán el tipo real del enumerable y el acceso directo si es posible; por ejemplo, Count()
verá si el método implementa ICollection<T>
, y si es así, leerá directamente su propiedad Count
; solo itera la colección si es necesario.
Dado que la mentalidad de un cortocircuito cuando sea práctico, parece que, si llamo ToArray()
en algo que ya es una matriz, ToArray()
podría cortocircuito y devuelva la misma instancia de matriz. Eso cumpliría técnicamente los requisitos de un método ToArray
.
Desde una prueba rápida, parece que, en .NET 4.0, llamando ToArray()
en una serie hace devolver una nueva instancia. Mi pregunta es: ¿puedo confiar en esto? ¿Se puede garantizar que ToArray
siempre devolverá una nueva instancia, incluso en Silverlight y en versiones futuras de .NET Framework? ¿Hay alguna documentación que sea clara en este punto?
+1 para la idea de prueba de la unidad. – NerdFury