Предположим, у вас есть базовый класс Employee
как таковой:
class Employee
{
public string Name;
public int Years;
public string Department;
}
Затем (в отдельном классе) у меня есть следующие фрагменты кода (я думаю, что я понимаю все, кроме последнего):
Я полагаю, что следующий фрагмент кода работает, потому что инициализатор массива создает массив объектов Employee, которые имеют тот же тип, что и переменная рабочей силы, присваиваемой.
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" } };
Затем у меня есть следующий кодфрагмент.Я считаю, что это работает, потому что массив неявных объектов Employee
является реализацией класса Array (), который реализует IEnumerable
.Поэтому я считаю, что именно поэтому массив может быть назначен 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" } };
Тогда у меня есть этот фрагмент кода:
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" } };
Я не уверен, почему этот кодФрагмент работает? IEnumerable<Employee>
наследует от IEnumerable
(и переопределяет (или перегружает?) метод GetEnumerator()
), но не должен ли я поэтому нуждаться в приведении приведенного выше кода для такой работы:
//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" } };
Кажется, что массив неявно преобразуется из типа IEnumerable
в IEnumerable<Employee>
, но я всегда думал, что когда вам нужно преобразовать тип во что-то более конкретное, вам нужен явный приведение.
Может быть, я упускаю что-то простое в моем понимании здесь, но может кто-нибудь, пожалуйста, помогите мне с моим пониманием в этом.
Спасибо.