Массив преобразования в IEnumerable < T >

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

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

Спасибо.

-121--62â2- java.io.InvalidClassException: InvalidClassException: локальный класс несовместим: класс потока SerityUID = -196410440475012755, локальный класс serityUID = -6675950253085108747 I структура с InvalidClassException
InvalidClassException: local class incompatible: stream classdesc serialVersionUID = -196410440475012755, local class serialVersionUID = -6675950253085108747

Я строю с помощью InvalidClassException в следующем сценарии. Здесь мой EAR установлен на 4 серверах Websphere App, и выполнение разделяется между ними. Иногда я получаю исключение InvalidClassException из класса POJO, который реализует интерфейс Serializable. Пожалуйста, намек на это. Я понятия не имею об этом.

8
задан Joachim Sauer 24 August 2011 в 09:45
поделиться