unity array c# arrays generics casting

c# - array - object[] to list



Casting matriz a IEnumerable<T> (3)

De la documentación :

En .NET Framework versión 2.0, la clase Array implementa las interfaces genéricas System.Collections.Generic.IList<T> , System.Collections.Generic.ICollection<T> y System.Collections.Generic.IEnumerable<T> . Las implementaciones se proporcionan a las matrices en tiempo de ejecución y, por lo tanto, no son visibles para las herramientas de creación de documentación. Como resultado, las interfaces genéricas no aparecen en la sintaxis de declaración para la clase Array, y no hay temas de referencia para los miembros de la interfaz a los que solo se puede acceder lanzando una matriz al tipo de interfaz genérica (implementaciones de interfaz explícita).

Por lo tanto, su Employee[] implementa IEnumerable<Employee> .

Supongamos que tiene una clase básica de Employee como tal:

class Employee { public string Name; public int Years; public string Department; }

Luego (en una clase separada) tengo los siguientes fragmentos de código (creo que lo entiendo todo menos el último):

Creo que el siguiente fragmento de código funciona porque el iniciador de la matriz crea una matriz de objetos Employee que son del mismo tipo que la variable de la fuerza de trabajo a la que se está asignando.

Employee[] workforceOne = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };

Luego tengo el siguiente fragmento de código. Creo que esto funciona porque la matriz de la Employee objetos del Employee es una implementación de la clase Array () que implementa IEnumerable . Por lo tanto, creo que esta es la razón por la matriz se puede asignar a IEnumerable?

IEnumerable workforceTwo = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };

Entonces tengo este fragmento de código:

IEnumerable<Employee> workforceThree = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };

No estoy seguro de por qué funciona este fragmento de código? IEnumerable<Employee> hereda de IEnumerable (y anula (¿o sobrecarga?) El método GetEnumerator() ) pero no debería, por lo tanto, necesitar un cast para que lo anterior funcione como tal:

//The cast does work but is not required IEnumerable<Employee> workforceFour = (IEnumerable<Employee>)new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };

Parece que la matriz está siendo implícitamente lanzada desde un tipo de IEnumerable a IEnumerable<Employee> pero siempre pensé que cuando necesitaras convertir un tipo a algo más específico necesitabas un yeso explícito.

Tal vez me estoy perdiendo algo simple en mi comprensión aquí, pero alguien puede por favor ayudarme con mi comprensión sobre esto.

Gracias.


La matriz de empleados implementa de forma predeterminada IEnumerable<Employee> e IEnumerable


Se necesita un lanzamiento explícito cuando se necesita descifrar alguna oración. Eso está lanzando un objeto a un tipo más especializado, si el objeto es de tipo especializado.

Por otro lado, el upcasting (conversión a un tipo menos especializado) nunca necesitará un lanzamiento explícito, pero puedes hacerlo explícitamente (es inútil).

Como Array implementa IEnumerable e IEnumerable<T> , estás haciendo un upcast en tu código, lo que significa que _no necesitas convertir explícitamente a IEnumerable<T> .