Assume you have a basic Employee
class as such:
class Employee
{
public string Name;
public int Years;
public string Department;
}
Then (in a seperate class) I have the following code fragments (I think i understand all but the last):
I believe that the following code fragment works because the array initiliser creates an array of Employee objects which are the same type as the workforce variable being assigned to.
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" } };
I then have the following code fragment. I believe this works because the array of Employee
objects implicity is an implementation of the Array() class which implements IEnumerable
. Therefore, I believe this is why the array can be assigned to 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" } };
Then I have this code fragment:
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" } };
I am not sure why this code fragment works? IEnumerable<Employee>
inherits from IEnumerable
(and overrides (or overloads?) the GetEnumerator()
method) but shouldn't i therefore need a cast for the above to work as such:
//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" } };
It seems that the array is being implicitly down cast from a type of IEnumerable
to IEnumerable<Employee>
but I always thought when you needed to convert a type to something more specific you needed an explicit cast.
Maybe i'm missing something simple in my understanding here but can someone please help me with my understanding around this.
Thank you.
See Question&Answers more detail:
os