Pregunta

Este es un código válido:

void func(IEnumerable<string> strings){
    foreach(string s in strings){
        Console.WriteLine(s);
    }
}

string[] ss = new string[]{"asdf", "fdsa"};
func(ss);

Lo que yo quiero saber es, ¿cómo funciona el trabajo implícita string[] -> IEnumerable<string> conversión?

¿Fue útil?

Solución

a partir de: MSDN clase Array

  

En la versión .NET Framework 2,0, la clase Array implementa el

     
      
  • IList<T>,
  •   
  • ICollection<T>, y
  •   
  • IEnumerable<T>
  •   
     

interfaces genéricas. Las implementaciones son proporcionado a las matrices en tiempo de ejecución , y por lo tanto no son visibles para las herramientas de documentación de la versión. Como resultado, las interfaces genéricas no aparecen en la sintaxis de la declaración de la clase Array, y no hay temas de referencia para los miembros de interfaz que son accesibles sólo por colada una matriz para el tipo de interfaz genérica (implementaciones de interfaces explícitas). La clave para estar al tanto de cuando lanzas una matriz a una de estas interfaces es que los miembros que se suman, insertar o borrar elementos arrojan NotSupportedException.

Otros consejos

Array clase, que es un animal muy extraño y se trató muy especialmente por el compilador JIT y (más sobre esto en los libros de Richter y Don caja de, supongo), implementa IEnumerable<T>.

Arrays implementan IEnumerable así que para cualquier T [] hay una conversión a IEnumerable .

  

¿cómo funciona la cadena de conversión implícita [?] -> trabajo IEnumerable

Ese tipo de pierde el punto, porque no hay conversión. Las matrices implementar (casi se podría decir "heredar de", si eso tiene más sentido para usted) IEnumerable, y así string [] ya está IEnumerable - no hay nada para convertir

Esta es una conversión de la interfaz estándar; como requisito, las matrices (T[]) implementan IEnumerable y IEnumerable<T>. Por lo que un string[] es 100% compatible con IEnumerable<T>. La aplicación es proporcionada por el compilador (matrices eran básicamente genérico antes de que existieran los genéricos de .NET).

A partir de la especificación (ECMA 334 v4) - esto es una consecuencia de 13.1.4:

  • Desde un S[] de tipo matriz unidimensional a System.Collections.Generic.IList<S> y la base las interfaces de esta interfaz.
  • Desde un tipo de matriz S[] unidimensional a System.Collections.Generic.IList<T> y las interfaces de base de esta interfaz, siempre que haya una conversión de referencia implícita de S a T.

Y recordar que IList<T> : IEnumerable<T>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top