Приведение массива к IEnumerable <T> - PullRequest
70 голосов
/ 24 августа 2011

Предположим, у вас есть базовый класс 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>, но я всегда думал, что когда вам нужно преобразовать тип во что-то более конкретное, вам нужен явный приведение.

Может быть, я упускаю что-то простое в моем понимании здесь, но может кто-нибудь, пожалуйста, помогите мне с моим пониманием в этом.

Спасибо.

Ответы [ 3 ]

100 голосов
/ 24 августа 2011

С документация :

В .NET Framework версии 2.0 класс Array реализует универсальные интерфейсы System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T> и System.Collections.Generic.IEnumerable<T>. Реализации предоставляются массивам во время выполнения и, следовательно, не видны инструментам сборки документации. В результате универсальные интерфейсы не появляются в синтаксисе объявления для класса Array, и нет никаких справочных разделов для членов интерфейса, которые доступны только путем приведения массива к универсальному типу интерфейса (явные реализации интерфейса).

Таким образом, ваш Employee[] реализует IEnumerable<Employee>.

4 голосов
/ 24 августа 2011

Массив сотрудников по умолчанию реализует IEnumerable<Employee>, а также IEnumerable

3 голосов
/ 24 августа 2011

Явное приведение необходимо, когда какое-то предложение должно быть понижено . Это приводит объект к более специализированному типу - если объект имеет такой специализированный тип -.

С другой стороны, upcasting (приведение к менее специализированному типу) никогда не будет нуждаться в явном приведении, но вы можете сделать это явно (это просто бесполезно).

Поскольку Array реализует IEnumerable и IEnumerable<T>, вы делаете upcast в своем коде, что означает, что вам не нужно явно приводить к IEnumerable<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...